如何在ASP.NET MVC中的页面之间正确发布值?

时间:2014-01-12 21:50:21

标签: c# asp.net-mvc asp.net-mvc-4

对于爱情和金钱,我无法理解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?

1 个答案:

答案 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
}