অনুরোধের ডেটা হারানো ছাড়া কীভাবে এএসপি.নেট এমভিসি-তে পুনর্নির্দেশ করবেন


123

এএসপি.এনইটি এমভিসি ব্যবহার করে এমন পরিস্থিতি রয়েছে (যেমন ফর্ম জমা দেওয়ার জন্য) যা প্রয়োজন হতে পারে RedirectToAction

এরকম একটি পরিস্থিতি হ'ল যখন আপনি কোনও ফর্ম জমা দেওয়ার পরে বৈধতা ত্রুটির মুখোমুখি হন এবং ফর্মটিতে আবার পুনর্নির্দেশ করা প্রয়োজন তবে আপনি URL টি ফর্মের URL প্রতিফলিত করতে চান, এটি জমা দেওয়া কর্ম পৃষ্ঠা নয়।

আমি যেমন ফর্মটি মূলত POSTএড ডেটা, ব্যবহারকারীর সুবিধার্থে, পাশাপাশি বৈধতার উদ্দেশ্যে রাখার প্রয়োজন, আমি কীভাবে ডেটা পাস করব RedirectToAction()? আমি যদি ভিউডাটা প্যারামিটার ব্যবহার করি তবে আমার POSTপরামিতিগুলি পরামিতিগুলিতে পরিবর্তিত হবে GET


এখানে একটি প্রশ্ন যা একই (একই বিষয়ে), তবে এটির চেয়ে আলাদা। যাইহোক, এখনও এই প্রশ্নে আগ্রহীদের পক্ষে এটি আগ্রহী হতে পারে: http://stackoverflow.com/questions/129335/how-do-you-redirecttoaction-
using-post-intead-

ত্রুটি থাকলে আপনি কেন একই দৃষ্টিভঙ্গি ফিরিয়ে দিচ্ছেন না? মডেলটি বৈধ হলে সাধারণত পুনঃনির্দেশটোকশন বলা হয় - বা আমি কিছু মিস করছি ?!
নিকো

উত্তর:


81

সমাধানটি হ'ল পছন্দসই অনুরোধের উপাদানগুলি সঞ্চয় করতে টেম্পডাটা সম্পত্তিটি ব্যবহার করা।

এই ক্ষেত্রে:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

তারপরে আপনার "ফর্ম" ক্রিয়ায় আপনি যেতে পারেন:

public ActionResult Form()
{
    /* Declare viewData etc. */

    if (TempData["form"] != null)
    {
        /* Cast TempData["form"] to 
        System.Collections.Specialized.NameValueCollection 
        and use it */
    }

    return View("Form", viewData);
}

1
RedirectToAction (a => a.Form ()) আমার জন্য এমভিসিভি 2 ব্যবহার করে সংকলন করে না, আপনি কি এমভিসিভি 3 ব্যবহার করছেন?
ক্রিসঅনোডেল

1
এটি প্রাক-এমভিসি 1 (২০০৮) ছিল। Lambdas কিছু পর্যায় আমি বিশ্বাস করি দিকে সরানো হয় (একটি codeplex প্রকল্পের MVCContrib যে reintroduces তাদের যদিও আপনি পাশাপাশি যে পর্যায়ে তাদের সাহায্যকারী বৈশিষ্ট্য ব্যবহার করতে পারেন: stackoverflow.com/questions/1936/... )। এমভিসি 2 এ আপনার পুনরায় ডাইরেক্টটও অ্যাকশন ("ফর্ম") যেতে হবে, যেমন একটি স্ট্রিং হিসাবে নাম, যদিও আমি শিথিলভাবে স্মরণ করি যে এমভিসি 2 বা 3 এমভিসিসিন্ট্রিবিতে অনুরূপ একটি সহায়ক বৈশিষ্ট্য প্রবর্তন করে যদি আপনি অনুসন্ধানে যেতে আগ্রহী হন।
ম্যাট মিশেল

37

মনে রাখবেন যে টেম্পাটাটা সেশনে ফর্ম সংগ্রহটি সঞ্চয় করে। যদি আপনি এই আচরণটি পছন্দ না করেন তবে আপনি নতুন ITempDataProvider ইন্টারফেসটি প্রয়োগ করতে পারবেন এবং টেম্পোর ডেটা সঞ্চয় করার জন্য কিছু অন্যান্য প্রক্রিয়া ব্যবহার করতে পারেন। সেশন স্টেটের ব্যবহার আপনাকে ক্ষতিগ্রস্থ করছে এমন কোনও সত্যের (পরিমাপ এবং প্রোফাইলের মাধ্যমে) আপনি যদি না জানেন তবে আমি তা করব না।



8

আরও একটি উপায় রয়েছে যা টেম্পাটাটা এড়িয়ে চলে। আমার পছন্দ মতো প্যাটার্নটিতে অবৈধ ফর্মটির মূল রেন্ডার এবং পুনরায় রেন্ডার উভয়ের জন্য ১ টি ক্রিয়া তৈরি করা জড়িত। এইটার মতো কিছু একটা হচ্ছে:

var form = new FooForm();

if (request.UrlReferrer == request.Url)
{
     // Fill form with previous request's data
}

if (Request.IsPost())
{
     if (!form.IsValid)
     {
         ViewData["ValidationErrors"] = ...
     } else {
         // update model
         model.something = foo.something;
         // handoff to post update action
         return RedirectToAction("ModelUpdated", ... etc);
     }
}

// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();

সেই প্যাটার্নটি কমবেশি। একটু সিউডয়। এটির সাহায্যে আপনি ফর্মের রেন্ডারিং পরিচালনা করতে, মানগুলি পুনরায় প্রদর্শন করতে (যেহেতু ফর্মটি পূর্বের মানগুলি দিয়ে পূর্ণ হবে) এবং ত্রুটি বার্তাগুলি প্রদর্শন করতে 1 টি ভিউ তৈরি করতে পারেন।

এই ক্রিয়াকলাপে পোস্ট করার পরে, যদি এটি বৈধ হয় তবে এটি নিয়ন্ত্রণটিকে অন্য ক্রিয়ায় স্থানান্তর করে।

আমরা এমভিসির পক্ষে সমর্থন তৈরি করার কারণে। নেট বৈধকরণ ফ্রেমওয়ার্কে এই প্যাটার্নটিকে সহজ করার চেষ্টা করছি ।


আমি টেম্পাটাটাও ব্যবহার করি, সমস্যাটি যেমন আমি বুঝতে পেরেছি, ততই সমাধান হিসাবে আপনার সমাধান ডিনো হ'ল ব্যবহারকারী যদি অবৈধ ডেটা পোস্ট করার পরে পৃষ্ঠাটি রিফ্রেশ করে তবে তারা "আপনি কি ফর্ম ডেটা পুনরায় জমা দিতে চান" নিশ্চিতকরণটি পাবেন। টেম্প্যাটা সমাধানটি ম্যাটমিশেল বলেছেন হিসাবে এই সমস্যাটিকে দূর করে।
ব্যবহারকারী 10479

কুল। দেখে মনে হচ্ছে কেউ এই প্রাথমিক ধারণাটি 5 টি পূর্বরূপের সাথেও লক্ষ্য করেছে।
ম্যাট মিচেল

2

আপনি যদি পুনঃনির্দেশিত ক্রিয়ায় ডেটাটি পাস করতে চান তবে আপনি যে পদ্ধতিটি ব্যবহার করতে পারেন তা হ'ল:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);

0

টেম্পডাটা হ'ল এমন সমাধান যা ডেটাটিকে ক্রিয়া থেকে ক্রিয়াতে রাখে।

Employee employee = new Employee
                {
                        EmpID = "121",
                        EmpFirstName = "Imran",
                        EmpLastName = "Ghani"
                };
                TempData["Employee"] = employee;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.