[英]How do I correctly post values between pages in ASP.NET MVC?
For love nor money I can't understand the magic mapping that ASP.NET MVC performs when I post values between pages. 为了爱情或金钱,当我在页面之间发布值时,我无法理解ASP.NET MVC执行的魔术映射。
I have a "wizard" consisting of 3 controller actions: NewRequest, NewRequestValidation and PostNewRequest. 我有一个由3个控制器操作组成的“向导”:NewRequest,NewRequestValidation和PostNewRequest。 NewRequest collects some form input and passes it to NewRequestValidation where the user confirms their request and either submits it to PostNewRequest or rejects it and returns to NewRequest.
NewRequest收集一些表单输入并将其传递给NewRequestValidation,在此用户确认他们的请求,然后将其提交给PostNewRequest或拒绝它并返回给NewRequest。
NewRequest uses: NewRequest使用:
@model SCL.Intranet.Controllers.HR.LeaveRequests.NewLeaveRequestViewModel
NewRequestValidation expects the NewLeaveRequestViewModel as a parameter on the method signature: NewRequestValidation希望将NewLeaveRequestViewModel作为方法签名上的参数:
public ActionResult NewRequestValidation(NewLeaveRequestViewModel lrvm)
It then does some validation and passes a NewLeaveRequestAnalysisViewModel
down to the corresponding View. 然后,它进行一些验证,并将
NewLeaveRequestAnalysisViewModel
向下传递到相应的View。
The NewRequestValidation view uses: NewRequestValidation视图使用:
@model SCL.Intranet.Controllers.HR.LeaveRequests.NewLeaveRequestAnalysisViewModel
I am trying to post some parts of the NewLeaveRequestAnalysisViewModel, specifically the "NewLeaveRequestViewModel" part into PostNewRequest. 我正在尝试将NewLeaveRequestAnalysisViewModel的某些部分,特别是“ NewLeaveRequestViewModel”部分发布到PostNewRequest中。
My form definition, including some hidden fields to transport the appropriate values, looks like: 我的表单定义(包括一些用于传输适当值的隐藏字段)如下所示:
@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.
}
Finally, PostNewRequest expects a NewLeaveRequestViewModel: 最后,PostNewRequest需要一个NewLeaveRequestViewModel:
public ActionResult PostNewRequest(NewLeaveRequestViewModel lrvm)
I understand that I need to pass a NewLeaveRequestViewModel in, and that my current code doesn't work because I'm actually just passing in a bunch of fields that happen to have their values from a previous instance of NewLeaveRequestViewModel. 我知道我需要传入一个NewLeaveRequestViewModel,而我的当前代码不起作用,因为实际上我只是传入了一些字段,这些字段恰好具有来自NewLeaveRequestViewModel的先前实例的值。
The question is: How do I set up a new NewLeaveRequestViewModel in NewRequestValidation that will match the signature on PostNewRequest? 问题是:如何在NewRequestValidation中设置与PostNewRequest上的签名匹配的新NewLeaveRequestViewModel?
I fixed this by using TempData as suggested (I think!) by meda. 我通过使用meda建议的TempData来解决此问题。
In the "NewRequestValidation" action, I commit the NewLeaveRequestViewModel to TempData: 在“ NewRequestValidation”操作中,我将NewLeaveRequestViewModel提交给TempData:
TempData.Add("PendingLeaveRequest", lrvm);
Then, in PostNewRequest, I get it back out of TempData again: 然后,在PostNewRequest中,我再次将其从TempData中取出:
if (TempData.ContainsKey("PendingLeaveRequest"))
{
var lrvm = TempData["PendingLeaveRequest"] as NewLeaveRequestViewModel;
// Do something with lrvm
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.