Строго типизированная ViewModel в методе действия POST содержит только нулевые значения - PullRequest
7 голосов
/ 14 апреля 2009

Я пытаюсь реализовать свои методы действия 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", "*") %>

Ответы [ 3 ]

7 голосов
/ 14 апреля 2009

Вам необходимо назвать свои поля в соответствии с префиксами в модели. Кроме того, вам нужно будет изменить модель представления, чтобы использовать свойства вместо полей. Привязка модели по умолчанию при связывании учитывает только общие свойства модели.

    <label for="Customer.FirstName">FirstName:</label>
    <%= Html.TextBox("Customer.FirstName") %>
    <%= Html.ValidationMessage("Customer.FirstName", "*") %>

Таким образом, средство связывания модели знает, как связать параметр формы с соответствующим компонентом и связанным свойством вашей модели.

6 голосов
/ 14 января 2010

Прошло много времени, но ответа на этот вопрос действительно не было.

Вмешивался в ту же проблему, пока не обнаружил свойство auto в моей модели представления, имеющей частный набор.

Глядя на вашу модель представления, вам не хватает всех автоматических свойств get и сеттеров!

Поэтому измените свою модель представления соответственно:

public class CustomersFormViewModel

    {
        public SelectList AccountTypesDropDownBox {get; set;}
        public SelectList CountriesDropDownBox {get; set;}
        public Customer Customer {get; set;}
    }
0 голосов
/ 15 апреля 2009

Попробуйте

UpdateModel(model, "Customer");

А также посмотрите здесь:

Префикс UpdateModel - ASP.NET MVC

Если это все еще не работает, установите точку останова после UpdateModel. Если это не помогло, попробуйте quickWatch (ctrl + alt + q) с различными комбинациями вызова UpdateModel.

Если это все еще не сработало, подключите источник и немного отладьте :). Вы узнаете что-то новое, а потом расскажете нам об этом :). Тогда все счастливы.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...