对于爱情和金钱,我无法理解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
向下传递到相应的视图。
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实例获取其值的字段。
问题是:如何在NewRequestValidation中设置一个与PostNewRequest上的签名匹配的新NewLeaveRequestViewModel?
答案 0 :(得分: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
}