Я пытаюсь реализовать свои методы действия Edit со строго типизированным представлением, которое получает пользовательский класс ViewModel. Другими словами, я хочу строго типизированный ViewModel, который содержит сущность Linq, которая должна быть отредактирована, а также несколько других объектов, которые должны отображаться в представлении.
Я могу видеть представление при вызове метода действия GET Edit, но строго типизированный метод действия POST получает только класс ViewModel с нулевыми параметрами, и я не могу понять, как извлечь параметры POST.
Модель просмотра выглядит следующим образом:
//my custom-shaped ViewModel
public class CustomersFormViewModel
{
public SelectList AccountTypesDropDownBox;
public SelectList CountriesDropDownBox;
public Customer Customer;
}
Метод действия выглядит следующим образом:
//
// 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>
Я также пробовал метод действия POST с параметрами formValues, но модель представления по-прежнему не содержала опубликованных параметров:
[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", "*") %>