كيفية RedirectToAction في ASP.NET MVC بدون فقدان بيانات الطلب

StackOverflow https://stackoverflow.com/questions/1936

  •  08-06-2019
  •  | 
  •  

سؤال

باستخدام ASP.NET MVC هناك حالات مثل (استمارة التقديم) التي قد تتطلب RedirectToAction.

واحد مثل هذا الوضع عندما كنت تواجه أخطاء التحقق من الصحة بعد تقديم النموذج و تحتاج إلى إعادة توجيه مرة أخرى إلى النموذج ، ولكن أود URL تعكس URL شكل لا عمل صفحة ترفعه إلى.

كما تتطلب استمارة تحتوي على الأصل POSTإد البيانات ، لراحة المستخدم ، وكذلك التحقق من صحة الأغراض ، كيف يمكنني تمرير البيانات من خلال RedirectToAction()?إذا كنت تستخدم viewData المعلمة ، POST المعلمات سيتم تغيير إلى GET المعلمات.

هل كانت مفيدة؟

المحلول

الحل هو استخدام TempData الملكية لتخزين المطلوب طلب المكونات.

على سبيل المثال:

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);
}

نصائح أخرى

نضع في اعتبارنا أن TempData مخازن شكل مجموعة في الدورة.إذا كنت لا تحب هذا السلوك, يمكنك تنفيذ الجديدة ITempDataProvider واجهة استخدام آليات أخرى لتخزين الحرارة البيانات.أنا لن تفعل ذلك إلا إذا كنت تعرف حقيقة (عن طريق قياس التنميط) أن استخدام الدورة الدولة يؤذيك.

نلقي نظرة على MVCContrib, يمكنك أن تفعل هذا:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}

هناك طريقة أخرى الذي يتجنب tempdata.نمط أحب تتضمن إنشاء 1 العمل على حد سواء الأصلي تجعل وإعادة تجعل من نموذج غير صالح.وغني عن شيء مثل هذا:

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();

هذا هو نمط أكثر أو أقل.قليلا pseudoy.مع هذا يمكنك إنشاء 1 عرض للتعامل مع تقديم النموذج إعادة عرض القيم (لأن الشكل سوف تكون مليئة القيم السابقة) ، و تظهر رسائل خطأ.

عندما نشر هذا العمل إذا كان صالح أنه نقل السيطرة إلى إجراء آخر.

أنا في محاولة لجعل هذا النمط من السهل في .صافي إطار التحقق ونحن نبني دعم MVC.

إذا كنت تريد تمرير البيانات إلى توجيه عمل, طريقة يمكنك استخدامها:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top