تمرير البيانات من وحدة تحكم لعرض مرة أخرى إلى وحدة تحكم مرة أخرى لعرض

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

سؤال

أنا جديد ASP.NET MVC.بعد العمل مع التقليدية ASP.NET نموذج لفترة طويلة ، ومن أخذ بعض الوقت بالنسبة لي للحصول على فهم هذا النموذج.

انا ذاهب من خلال NerdDinner إلى فهم كيفية عمل الأشياء.

لدي كائن التي تحتاج إلى تمرير من خلال بعض الآراء.على غرار المادة NerdDinner الخطوة 6:ViewData و ViewModel.

أنا الإبقاء على البيانات من الحصول على وظيفة لأول مرة ، ثم وضعه في TempData ونقله إلى عمل آخر (AnotherAction).مرة واحدة أحصل على البيانات على الحصول على أنا لا يمكن الاحتفاظ بها في ما بعد.

هنا هو بلدي رمز:

public class DinnerFormViewModel
{
    public Dinner Dinner { get; private set; }

    public DinnerFormViewModel(Dinner dinner)
    {
        Dinner = dinner;
    }
}

public class DinnersController : Controller
{
    public ActionResult Action()
    {
        Dinner dinner = new Dinner();
        return View(new DinnerFormViewModel(dinner));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Action(Dinner dinner, FormCollection collection)
    {
        try
        {
            // Some code
            TempData["Dinner"] = dinner;
            return RedirectToAction("AnotherAction");
        }
        catch
        {
            return View();
        }
    }

    public ActionResult AnotherAction()
    {
        Dinner dinner = (Dinner)TempData["Dinner"]; // Got my dinner object
        return View(new DinnerFormViewModel(dinner));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AnotherAction(Dinner dinner, FormCollection collection)
    {
        // Lost my dinner object, dinner comes in as null
    }
}
هل كانت مفيدة؟

المحلول

ووفقا لهذا بلوق وظيفة TempData هو فقط حول ل 1 طلب واحد بعد مجموعتها.

وهنا هو اقتباس من مشاركة:

<اقتباس فقرة>   

إذا قمت بتعيين TempData والعمل الخاص بك، ثم بإرجاع ViewResult، ثم طلب المقبل، أيا كان يحدث أن تكون (طلب AJAX، صفحة أخرى للمستخدم فتح في علامة تبويب مختلفة، وما إلى ذلك)، والذهاب لمشاهدة TempData القيمة التي قمت بتعيينها، وسوف أي طلب آخر رؤيتها.

وهكذا أعطيت التعليمات البرمجية التي اراه، يمكنك الحصول على العشاء من TempData على الحصول من AnotherAction الذي هو الطلب الأول بعد وضعها على Action. ومع ذلك النظر في قانون وعدم رؤية رمز لمشاهدة لAnotherAction أنه من غير الواضح كيف يتم تمرير البيانات إلى آخر لAnotherAction. على سبيل المثال العشاء لن يكون في TempData لهذا الطلب لأنه طلب الثاني بعد تعيينها في TempData. وإذا لم يكن لديك علامات شكل مناسبة تعيين على عرض AntoherAction سوف إطار يكن لديك قيم شكل مناسبة لمثيل كائن العشاء في آخر.

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

والمنظمة البحرية الدولية، يجب عليك استخدام الطرائق طريقة للقيام بذلك وتجنب استخدام TempData.

وتحرير واضاف مثال الإعادة TempData في AnotherAction للوصول إليها في ما بعد.

ونموذج:

  public class Dinner
  {
    public string Name{get;set;}
  }

  public class DinnerFormViewModel
  {
    public Dinner Dinner {get;private set;}

    public DinnerFormViewModel( Dinner dinner )
    {
      Dinner = dinner;
    }
  }

وحدة التحكم:

  public class DinnersController : Controller
  {
    public ActionResult Action()
    {
      Dinner dinner = new Dinner();
      return View( new DinnerFormViewModel( dinner ) );
    }

    [AcceptVerbs( HttpVerbs.Post )]
    public ActionResult Action( Dinner dinner, FormCollection collection )
    {
      try
      {
        // Some code
        TempData[ "Dinner" ] = dinner;
        return RedirectToAction( "AnotherAction" );
      }
      catch
      {
        return View();
      }
    }

    public ActionResult AnotherAction()
    {
      Dinner dinner = ( Dinner )TempData[ "Dinner" ]; // Got my dinner object
      TempData[ "Dinner" ] = dinner; // Reset the dinner object in temp data
      return View( new DinnerFormViewModel( dinner ) );
    }

    [AcceptVerbs( HttpVerbs.Post )]
    public ActionResult AnotherAction( Dinner dinnerFromPostedFormValues, FormCollection collection )
    {
      //dinnerFromPostedFormValues is null
      var dinnerFromTempData = TempData[ "Dinner" ] as Dinner; // Got my dinner object

      return View( "Action", new DinnerFormViewModel( dinnerFromTempData ) );
    }
  }

والعمل الشخصي:

<h2>Action</h2>

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
           Name: <%= Html.TextBox("Name", Model.Dinner.Name ) %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

وAnotherAction الشخصي:

<h2>AnotherAction</h2>

<% using (Html.BeginForm()) {%>

  <fieldset>
      <legend>Fields</legend>
      <p>
          Name:
          <%= Html.Encode(Model.Dinner.Name) %>
      </p>

      <p>
          <input type="submit" value="Do Something" />
      </p>
  </fieldset>

<% } %>

نصائح أخرى

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

وأيضا، باستخدام نموذج ملزم هل يمكن أن تجعل نظرة التعليمات البرمجية في أفضل بعض الشيء، وتجنب TempData في الأماكن:

public ActionResult Action()
{
    Dinner dinner = new Dinner();
    return View(new DinnerFormViewModel(dinner));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Action(Dinner dinner)
{
    try
    {
        return RedirectToAction("AnotherAction", dinner);
    }
    catch
    {
        return View();
    }
}

public ActionResult AnotherAction(Dinner dinner)
{
    return View(new DinnerFormViewModel(dinner));

    //In this view is where you may want to populate some hidden fields with the Dinner properties that have already been entered... so when the Post action picks up the dinner object it will be fully populated
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AnotherAction(Dinner dinner)
{
    //work with fully populated Dinner object
}

وحتى في AnotherAction جهة النظر القائلة بأن لديك شيئا مثل:

<% using(Html.BeginForm()) { %>

    <%= Html.Hidden("dinnerProperty1") %>
    <%= Html.Hidden("dinnerProperty2") %>
    <%= Html.Hidden("dinnerProperty3") %>
    <%= Html.TextBox("dinnerProperty4") %>
    <%= Html.TextBox("dinnerProperty5") %>
    <%= Html.TextBox("dinnerProperty6") %>

<% } %>

وليس هناك سهولة في المثال أعلاه ولكن تحصل على هذه النقطة.

وأنت لا يمكن أن تمر الخام C # الكائنات من المشاهدات لتحكم.

في ASP.NET MVC، عندما يأخذ العمل كائن للمعلمة، ASP.NET MVC ينظر إلى كل POST / الحصول على البيانات ويبحث عن القيم التي تتزامن مع أسماء الملكية على الكائن المعلمة.

public ActionResult SomeAction(Dinner myDinner)
{
        // do stuff
}

وسوف يتم ملؤها الكائن myDinner فقط إذا قمت بنشر إلى العمل مع حقول النماذج التي تتوافق مع خصائص الكائن عشاء في (المكان والتاريخ، الخ)، أو إذا كنت لوضع تلك المعلومات في URL GET (العشاء / SomeAction؟ موقع = شيكاغو وتاريخ = 12/1/2009 الخ).

إذا كنت على الاطلاق لا يمكن استخدام الحقول المخفية (كما اقترح DM)، ثم جلسات وربما لديك الخيار الوحيد.

يجب أن تحصل على العشاء من مستودع.هل يجب أن يكون العمل مثل:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AnotherAction(int dinnerId, FormCollection collection)
{
    var dinner = dinnerRepository.Get(dinnerId);
    ... do something with dinner ...
    dinnerRepository.Save(dinner);
    return RedirectToAction("AnotherAction", ... pass dinner id ...);
}

على الإجراءات التي يمكن أن تتخذ أيضا من مستودع, حتى تتمكن من تمرير فقط معرف.

تحرير

إذا كنت ترغب في إنشاء معالج نمط الصفحة ، يمكنك تخزين البيانات المدخلة سابقا في الدورة كائن.

Session['CurrentDinner'] = dinner;

البيانات المخزنة في الدورة تستمر خلال الطلبات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top