Согласно этому сообщению в блоге TempData существует только для одного запроса после его установки.
Вот цитата из поста:
Если вы установили TempData, а ваше действие затем возвращает ViewResult, то следующий запрос, каким бы он ни был (запрос AJAX, другая страница, которую пользователь открыл на другой вкладке и т. Д.), Увидит TempData значение, которое вы установили, и никакой другой запрос его не увидит.
Итак, учитывая код, который я вижу, вы можете получить обед из TempData при получении от AnotherAction
, который является первым запросом после того, как вы установили его на Action
. Однако, глядя на код и не видя код для просмотра для AnotherAction
, неясно, как вы передаете данные в сообщение для AnotherAction
. Экземпляр ужин не будет находиться в TempData для этого запроса, потому что это второй запрос после того, как вы установили его в TempData. И если в представлении AntoherAction
не установлены правильные теги формы, в каркасе не будет правильных значений формы для создания экземпляра объекта ужин в публикации.
Так что либо вам придется сбросить TempData с помощью экземпляра обеда при первом вызове AnotherAction
, а затем извлечь обед из TempData в сообщении AnotherAction
, либо вы можете последовать совету dm и использовать скрытые поля. на ваш взгляд.
IMO, вы должны использовать способ DM для этого и избегать использования TempData.
Edit Добавлен пример сброса 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>
<% } %>
Другой вид действия:
<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>
<% } %>