2014-01-12 3 views
0

Для любви и денег Я не могу понять магическое сопоставление, которое выполняет ASP.NET MVC при отправке значений между страницами.Как правильно отправлять значения между страницами в ASP.NET MVC?

У меня есть «волшебник», состоящий из 3 действий контроллера: NewRequest, NewRequestValidation и PostNewRequest. NewRequest собирает ввод какой-либо формы и передает его в NewRequestValidation, где пользователь подтверждает свой запрос и либо отправляет его в PostNewRequest, либо отклоняет его, и возвращается в NewRequest.

NewRequest использует:

@model SCL.Intranet.Controllers.HR.LeaveRequests.NewLeaveRequestViewModel 

NewRequestValidation ожидает NewLeaveRequestViewModel в качестве параметра по сигнатуре метода:

public ActionResult NewRequestValidation(NewLeaveRequestViewModel lrvm) 

Затем он делает некоторые проверки и передает NewLeaveRequestAnalysisViewModel вниз к соответствующему View.

Вид NewRequestValidation использует:

@model SCL.Intranet.Controllers.HR.LeaveRequests.NewLeaveRequestAnalysisViewModel 

Я пытаюсь опубликовать некоторые части NewLeaveRequestAnalysisViewModel, в частности, "NewLeaveRequestViewModel" часть в PostNewRequest.

Мое определение формы, в том числе некоторых скрытых полей для транспортировки соответствующих значений, выглядит следующим образом:

@using (Html.BeginForm("PostNewRequest", "LeaveRequests", new { area = "HR" }, FormMethod.Post, new { @class = "form-horizontal" })) 
{ 
    @Html.HiddenFor(m => m.NewLeaveRequest) 
    @Html.HiddenFor(m => m.NewLeaveRequest.From.Date) 
    @Html.HiddenFor(m => m.NewLeaveRequest.From.Half) 
    @Html.HiddenFor(m => m.NewLeaveRequest.Until.Date) 
    @Html.HiddenFor(m => m.NewLeaveRequest.Until.Half) 
    @Html.HiddenFor(m => m.NewLeaveRequest.Type.LeaveRequestTypeId) 

    // Some presentation stuff here. 
} 

Наконец, PostNewRequest ожидает NewLeaveRequestViewModel:

public ActionResult PostNewRequest(NewLeaveRequestViewModel lrvm) 

Я понимаю, что мне нужно пройти NewLeaveRequestViewModel в, и что мой текущий код не работает, потому что я на самом деле просто передаю кучу полей, которые имеют свои значения из предыдущего экземпляра NewLeaveRequestViewModel.

Вопрос: Как настроить новый метод NewLeaveRequestViewModel в NewRequestValidation, который будет соответствовать сигнатуре PostNewRequest?

+0

, если вы действительно не должны , размещение формы в MVC не является лучшим способом. вместо этого вы хотите передать модели с контроллера на другой. – meda

+0

Спасибо @meda - вы можете объяснить больше, в чем разница? Я не совсем уверен, что понимаю ваше предложение. –

+0

@meda - будет ли это использовать TempData для хранения NewLeaveRequestViewModel, а затем получить его, если я удалю действие «PostNewRequest»? –

ответ

0

Я исправил это, используя TempData, как было предложено (я думаю!) По meda.

В акции "NewRequestValidation", я совершить NewLeaveRequestViewModel в TempData:

TempData.Add("PendingLeaveRequest", lrvm); 

Тогда в PostNewRequest, я получить его обратно из TempData снова:

if (TempData.ContainsKey("PendingLeaveRequest")) 
{ 
    var lrvm = TempData["PendingLeaveRequest"] as NewLeaveRequestViewModel; 
    // Do something with lrvm 
} 
Смежные вопросы