我正在尝试使用强类型视图实现我的Edit操作方法,该视图接收自定义形状的viewmodel类.换句话说,我想要一个强类型的viewmodel,它包含应该编辑的
Linq实体以及应该在View中显示的一些其他对象.
我可以在调用GET Edit操作方法时看到该视图,但强类型的POST操作方法只接收带有null参数的viewmodel类,我无法弄清楚如何检索POST参数.
View Model看起来如下:
//my custom-shaped viewmodel public class CustomersFormviewmodel { public SelectList AccountTypesDropDownBox; public SelectList CountriesDropDownBox; public Customer Customer; }
action方法如下所示:
// // GET: /CustomersController/Edit public ActionResult Edit(int ID) { var model = new CustomersFormviewmodel { Customer = repository.Load(ID.Value),CountriesDropDownBox = GetCountries(),AccountTypesDropDownBox = GetAccountTypes() }; return View(model); } // // POST: /CustomersController/Edit [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(CustomersFormviewmodel model) { //THE NEXT LINE THROWS!!! Debug.Assert(Model.Customer!=null); return View(model); }
这是我的编辑视图:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/CustAdminMaster.master" Inherits="System.Web.Mvc.ViewPage<Zeiterfassung.Controllers.CustomersController+CustomersFormviewmodel>" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> NewEdit </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2> NewEdit</h2> <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> <% using (Html.BeginForm()) {%> <fieldset> <legend>Fields</legend> <p> <label for="FirstName">FirstName:</label> <%= Html.TextBox("FirstName",Model.Customer.FirstName) %> <%= Html.ValidationMessage("FirstName","*") %> </p> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> <div> <%=Html.ActionLink("Back to List","Index") %> </div> </asp:Content>
我还尝试了一个带有formValues参数的POST动作方法,但是viewmodel仍然没有包含已发布的参数:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int ID,FormCollection formValues) { CustomersFormviewmodel model = new CustomersFormviewmodel(); UpdateModel(model); //THE NEXT LINE STILL THROWS Debug.Assert(model.Customer!=null); return View("NewEdit",model); }
到目前为止,我找到的唯一方法是编写自己的代码,从FormCollection中获取已发布的参数,并相应地更新我的自定义viewmodel.但这种方法似乎有点原始.真的没有更好的办法吗?
编辑:我刚刚在视图中尝试了不同的语法,如tvanfosson所建议,但问题仍然没有改变:
<label for="Customer.FirstName">FirstName:</label> <%= Html.TextBox("Customer.FirstName") %> <%= Html.ValidationMessage("Customer.FirstName","*") %>