Проблема возврата ViewModel из редактирования - PullRequest
0 голосов
/ 18 июля 2010

Я пытаюсь вернуть ту же модель обратно в представление, которое редактировало модель.Делая что-то вроде Word или что-то с функциональностью ctrl + s для сохранения режима.Это прекрасно работает, хотя модель, возвращаемая в представление, содержит несколько нулей по какой-то глупой причине.Это потому, что вещи не были сериализованы должным образом, когда контроллер вернул модель представления, или я неправильно обрабатывал MVC?

Это модель

public class EditInvoiceModel
{
    private readonly IEnumerable<Customer> _customers;

    public EditInvoiceModel()
    {
        CreateProduct = new Product { Invoice = Invoice };
        CreateWorkday = new Workday { Invoice = Invoice };
    }

    public EditInvoiceModel(Invoice invoice, IEnumerable<Customer> customers)
    {
        Invoice = invoice;
        _customers = customers;

        Customers = _customers.Select(x =>
                                      new SelectListItem
                                        {
                                            Selected = x.Id == Invoice.CustomerID,
                                            Text = x.Name,
                                            Value = x.Id.ToString()
                                        });

        Products = Invoice.Products;
        Workdays = Invoice.Workdays;

        CreateProduct = new Product {Invoice = Invoice};
        CreateWorkday = new Workday { Invoice = Invoice };
    }

    public IEnumerable<SelectListItem> Customers { get; set; }
    public IEnumerable<Product> Products { get; set; }
    public IEnumerable<Workday> Workdays { get; set; }
    public Product CreateProduct { get; set; }
    public Workday CreateWorkday { get; set; }
    public Invoice Invoice { get; set; }
}

И это действие контроллеравозвращает модель обратно в то же представление.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(EditInvoiceModel invoiceModel)
{
    try
    {
        _repository.UpdateInvoice(invoiceModel.Invoice);
    }
    catch (Exception ex)
    {
        Log.Error(ex);
    }

    return View(invoiceModel);
}

Все свойства, кроме Invoice, имеют значение NULL, когда они возвращаются в представление.Я понятия не имею, почему это происходит.Надеюсь, что кто-то может помочь.

Проблема, которая возникает (в представлении), заключается в следующем: Это не из-за опечатки, поскольку она работает нормально при первом запуске представления.Это должно быть связано с проблемой связывателя модели или моего использования связывателя модели.

The ViewData item that has the key 'Invoice.CustomerID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.InvalidOperationException: The ViewData item that has the key 'Invoice.CustomerID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.

Source Error: 

Line 28:        <div class="editor-field">
Line 29:            <%: Html.DropDownListFor(x => x.Invoice.CustomerID, Model.Customers)%>
Line 30:            <%: Html.ValidationMessageFor(x => x.Invoice.CustomerID)%>
Line 31:        </div>

Наконец часть представления, отображающая модель представления.

<%@ page language="C#" masterpagefile="~/Views/Shared/Site.Master" 
    inherits="System.Web.Mvc.ViewPage<FakturaLight.WebClient.Models.EditInvoiceModel>" %>
<asp:content id="Content2" contentplaceholderid="MainContent" runat="server">
    <%= Html.ValidationSummary() %>
    <% using (Html.BeginForm())
    { %>
    <%= Html.AntiForgeryToken() %>
    <div class="content-left">
        <%: Html.EditorFor(x => x.Invoice) %>
        <div class="editor-label">
            <%: Html.LabelFor(x => x.Invoice.CustomerID)%>
        </div>
        <div class="editor-field">
            <%: Html.DropDownListFor(x => x.Invoice.CustomerID, Model.Customers)%>
            <%: Html.ValidationMessageFor(x => x.Invoice.CustomerID)%>
        </div>
    <% } %>
    </div>
    <div class="content-right" id="details" style=" clear:both;">
        <div id="workdays">
            <%: Html.DisplayFor(x => x.Workdays) %>
        </div>
        <div id="products">
            <%: Html.DisplayFor(x => x.Products) %>
        </div>
    </div>
</asp:content>

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Дарин прав.Помните, что вы все еще работаете с отключенным клиентом.Это просто HTML и HTTP под прикрытием.Связыватель модели может связывать только те значения, которые передаются на сервер в HTTP POST.Все остальные свойства для класса не получат назначения, поэтому, если вы хотите, чтобы более полная модель была отправлена ​​обратно в браузер в ответ в

return View(invoiceModel);

, вам нужно будет выполнить эти назначения свойств на стороне сервера ввозможно, ваш контроллер или метод обновления вашего репозитория.

1 голос
/ 18 июля 2010

Причина, по которой заполняется только свойство Invoice, заключается в том, что в вашей форме для него имеются только поля ввода и раскрывающиеся списки. Связыватель модели заполняет свойства из того, что отправлено в запросе. Вы публикуете форму, которая содержит значения только для Invoice. Что касается свойств Workdays и Products, то вы только отображаете их (Html.DisplayFor), и они никогда не отправляются на сервер. Кроме того, связыватель модели вызывает конструктор по умолчанию вашей модели, который также не инициализирует эти свойства, поэтому они не имеют значения при обратной передаче.

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