আপনি কীভাবে পোষ্ট ক্রিয়া ব্যবহার করে কোনও পৃষ্ঠাতে পুনর্নির্দেশ করবেন?


131

আপনি যখন RedirectToActionকোনও নিয়ামকের মধ্যে কল করেন , এটি স্বয়ংক্রিয়ভাবে কোনও HTTP জিইটি ব্যবহার করে পুনঃনির্দেশ করে। এইচটিটিপি পোস্ট ব্যবহার করার জন্য আমি কীভাবে স্পষ্টভাবে এটি বলতে পারি?

আমার একটি ক্রিয়া রয়েছে যা GET এবং POST উভয় অনুরোধ গ্রহণ করে এবং আমি RedirectToActionPOST ব্যবহার করতে সক্ষম হতে চাই এবং এটি কিছু মান পাঠাতে চাই।

এটার মত:

this.RedirectToAction(
    "actionname",
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);

আমি চাই someValueএবং anotherValueমান একটি GET পরিবর্তে একটি HTTP POST ব্যবহার করে প্রেরণ করা হয়। কেউ কি জানেন, এটা কিভাবে করে?


জেসন দ্বারা উত্তর পোস্ট করা বেশিরভাগ পরিস্থিতিতে কাজ করবে, আমি যে সমস্যাটি দেখি তা হ'ল এটি দুর্ঘটনাজনিত প্রবণ। অর্থাত্ অ্যাকশন পদ্ধতিতে কল করা অ্যাকশনে প্রয়োগ হওয়া সমস্ত ফিল্টারকে সরাসরি বাইপাস করে। সুতরাং, যদি অ্যাকশন পদ্ধতিতে কোনও প্রমাণীকরণ বা পাল্টা ধরণের ফিল্টার প্রয়োগ করা থাকে তবে সেই ডেটাটি নষ্ট হয়ে যেতে পারে। সরাসরি অ্যাকশন পদ্ধতিতে কল করা কার্যকর হবে তবে এটি সাবধানতার সাথে প্রয়োগ করা উচিত।
অমরনাথ চ্যাটার্জী

উত্তর:


103

HTTP পোষ্ট ব্যবহার করে কোনও পৃষ্ঠায় পুনঃনির্দেশ সমর্থন করে না। আপনি কোথাও পুনর্নির্দেশ করার সময়, HTTP "অবস্থান" শিরোনাম ব্রাউজারটি কোথায় যেতে হবে তা জানায় এবং ব্রাউজারটি সেই পৃষ্ঠার জন্য একটি জিইটি অনুরোধ করে। জিইটি অনুরোধের পাশাপাশি পোষ্ট অনুরোধগুলি গ্রহণ করার জন্য আপনাকে সম্ভবত আপনার পৃষ্ঠার কোডটি লিখতে হবে।


4
আমার উত্তর কেন গৃহীত হয়নি তা আগ্রহী, আমি মনে করি আমার বক্তৃতাটি যথাযথ। :) এরপরে, আমি এটি সম্পর্কে কিছুটা পক্ষপাতদুষ্ট হতে পারি ...
জেসন বুটিং

14
যদিও এই উত্তরটি মূলত সঠিক, এটি সম্পূর্ণ নয়। আরও ভাল কাজের জন্য নীচে জেসন বুটিংয়ের উত্তরটি দেখুন।
অ্যাড্রিয়ান গ্রিগোর

160

আপনার নির্দিষ্ট উদাহরণের জন্য, আমি কেবল এটিই করব, যেহেতু আপনি অবশ্যই ব্রাউজারটিকে যেভাবেই পুনর্নির্দেশ করতে হবে (আপনি ইতিমধ্যে স্বীকার করে নেওয়া উত্তরটি গ্রহণ করার কারণে):

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
   // obviously these values might come from somewhere non-trivial
   return Index(2, "text");
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int someValue, string anotherValue) {
   // would probably do something non-trivial here with the param values
   return View();
}

এটি সহজেই কাজ করে এবং কোনও মজার ব্যবসা সত্যিই চলছে না - এটি আপনাকে এই সত্যটি বজায় রাখার অনুমতি দেয় যে দ্বিতীয়টি সত্যই কেবল এইচটিটিপি পোস্ট অনুরোধ গ্রহণ করে (এই উদাহরণটি বাদ দিয়ে যা কোনওভাবে আপনার নিয়ন্ত্রণে রয়েছে) এবং আপনাকে করতে হবে না টেম্পডাটাটি ব্যবহার করুন, যা আপনার উত্তরে পোস্ট করা লিঙ্কটিই আপনাকে পরামর্শ দিচ্ছে।

আমি এর সাথে "ভুল" কী তা জানতে আগ্রহী, যদি কিছু থাকে তবে। স্পষ্টতই, আপনি যদি ব্রাউজারে সত্যই পুনঃনির্দেশ পাঠাতে চান তবে এটি কার্যকর হবে না, তবে আপনাকে কেন জিজ্ঞাসা করা উচিত যে আপনি কেন নির্বিশেষে রূপান্তরিত করার চেষ্টা করছেন, কারণ এটি আমার কাছে অদ্ভুত বলে মনে হচ্ছে।

আশা করি এইটি কাজ করবে.


7
কেন আপনি নিম্নচাপে ছিলেন কে জানে। এটি একটি খুব দরকারী পদ্ধতি।
পিটার জে

2
এইভাবে আমি সবসময় এই সমস্যাটিও সমাধান করেছি। এটিকে উঁচু করে তোলা কোনও অর্থবোধ করে না।
অ্যাড্রিয়ান গ্রিগোর

39
আমি ভোট দিয়েছি, যদিও আমি লোকদের বোকা বানানোর সাথে একমত নই যখন আপনি তাদের চেনেন না।
জিম শুবার্ট

3
আমি ডাউনওয়োটার নই, তবে এর সাথে সতর্কতা হ'ল যদি আপনি কোনও ভিন্ন নামের সাথে একটি ভিউ কল করতে চান বা পরামিতিগুলি গুরুত্বপূর্ণ হয় তবে সেগুলি হারিয়ে যায়। ইউআরএল হবার কারণটি সার্ভারের দিকটি পুনঃনির্দেশের আগে অ্যাকশন + পরামিতিগুলি প্রতিফলিত করবে। এটি ব্যবহারকারী দ্বারা বিভ্রান্তির সৃষ্টি করতে পারে, বিশেষত যদি তারা পৃষ্ঠাটি রিফ্রেশ করে এবং তারপরে তারা পূর্ববর্তী পৃষ্ঠায় নিজেকে খুঁজে পায় (কারণ রিফ্রেশটি পুরানো ইউআরএল ব্যবহার করেছিল)। এই কৌশলটি মূলত এসপ নেটওয়ারের সার্ভারের সাথে খুব সাদৃশ্য rans ট্রান্সফার এবং একই সতর্কতা অবলম্বন করা উচিত।
অ্যারোনএলএস

15
আমি প্রতি সে ডাউন ডাউন করেনি তবে এর কারণ দেখতে পাচ্ছি। এই পদ্ধতিটি এমভিসি প্যাটার্ন দ্বারা প্রতিষ্ঠিত কোডিং কনভেনশন লঙ্ঘন করে। এটি কেবল একই ক্রিয়াকে কল করার সময় কাজ করে। ক্রিয়াটি যদি অন্য কোনও হয় তবে এমনকি একই নিয়ামকের উপরও, রাউটিংয়ের মানগুলি স্ক্রুযুক্ত হয় এবং ভুল দর্শনটি ফিরে আসবে। সংক্ষেপে: এটি করবেন না।
এরল্যান্ডো

21

আপনি যদি ক্যোয়ারী স্ট্রিংয়ের কোনও ডেটা অন্তর্ভুক্ত না করে পুনঃনির্দেশের সময় দুটি ক্রিয়াগুলির মধ্যে ডেটা পাস করতে চান তবে টেম্পডাটা অবজেক্টে মডেলটি রাখুন।

কর্ম

TempData["datacontainer"] = modelData;

দেখুন

var modelData= TempData["datacontainer"] as ModelDataType; 

টেম্পটাটা খুব স্বল্পস্থায়ী উদাহরণ হিসাবে বোঝানো হয় এবং আপনার কেবল এটি বর্তমান এবং পরবর্তী অনুরোধগুলির সময় ব্যবহার করা উচিত! টেম্পডাটা যেহেতু এইভাবে কাজ করে, আপনার পরবর্তী অনুরোধটি কী হবে তা নিশ্চিতভাবে আপনার জানতে হবে এবং অন্য বারে আপনাকে পুনঃনির্দেশ করা কেবলমাত্র একবার আপনি এই গ্যারান্টি দিতে পারেন।

অতএব, যখন আপনি পুনর্নির্দেশ করছেন তখন কেবলমাত্র টেম্পডেটা নির্ভরযোগ্যতার সাথে কাজ করবে scenario


11

আর একবার চেষ্টা কর

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>");

2
এটি ঘৃণা করুন তবে এটি
ভালোবাসুন

এ জাতীয় একটি হ্যাক তবে কেবলমাত্র ডিআরওয়াই লঙ্ঘন না করে বা আমার পুরো সেটআপটি পুনর্নির্মাণ না করে যা করতে চেয়েছিলাম তা করতে পেরেছি! ধন্যবাদ!
জামহেডার্ট

6

আমি জেসন বুটিংয়ের উত্তরটি প্রসারিত করতে চাই

এটার মত

ActionResult action = new SampelController().Index(2, "text");
return action;

এবং এলি এটিকে জেনেরিক পরিবর্তনশীল কীভাবে তৈরি করবেন সে সম্পর্কে কিছু ধারণার জন্য এখানে আসবেন

সব ধরণের নিয়ামক পেতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.