Связывание моделей ASP.Net MVC - PullRequest
0 голосов
/ 17 августа 2010

У меня есть модель, которую можно правильно связать для отображения, но я не могу опубликовать обновленную версию.

Я могу отобразить страницу и ее список содержимого в форме для обновления в строго типизированном виде.view.

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

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

Но когда я обновляю и публикую PageContents, запись на странице не содержится.может быть красная сельдь, но я использую Fluent nHibernate)

К сожалению, я не могу найти то, что мне не хватает.

Итак, вот сокращенная версия моего кода:

public class Page
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual string Title { get; set; }

    public virtual IList<PageContent> PageContents { get; private set; }

    public Page()
    {
        PageContents = new List<PageContent>();
    }

    public virtual void AddPageContent(PageContent pageContent)
    {
        pageContent.Page = this;
        PageContents.Add(pageContent);
    } 
}


public class PageContent
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string Content { get; set; }
    public virtual Page Page { get; set; }
}
Page <%= Html.LabelFor(model => model.Title) %>:
<%= Html.TextBoxFor(model => model.Title, new { @class = "wide-input" })%>
<%= Html.ValidationMessageFor(model => model.Title) %>

Page <%= Html.LabelFor(model => model.Name) %>:
<%= Html.TextBoxFor(model => model.Name, new { @class = "wide-input" })%>
<%= Html.ValidationMessageFor(model => model.Name) %>

<% 
    foreach (var item in Model.PageContents)
    {
%>
        <%= Html.TextAreaFor(m => item.Content) %>

<%
    } 
%>

<p><input type="submit" value="Save" /></p>

<% } %>

1 Ответ

1 голос
/ 17 августа 2010

В основном вам нужны уникальные идентификаторы для каждого элемента списка.Что-то вроде

<input id="PageContents_0_Content" name="PageContents[0].Content" value="..." />

Это может быть сделано:

<%= Html.TextBox(string.Format("PageContents[{0}].Content", i), Model.Products[i].Id) %>

Этот блог:

http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

Этот блог описывает многолучшее решение:

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Для инициализации привязок к списку используется собственный метод HTML Helper.

РЕДАКТИРОВАТЬ: Я неправильно понял,была сфокусирована на коллекциях с ASP.NET MVC:

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

Насколько я знаю, MVC не может восстановить эти отношения.Если страница уже содержит PageContent после PostBack, то все в порядке.Значит: Ваши коллекции правильно выложены обратно.Но MVC не имеет ни малейшего представления о вашей ссылке на PageContent.Page.Поэтому вам нужно восстановить, если вручную.

EDIT2:

(КСТАТИ может быть красная сельдь, но я использую Fluent nHibernate)

Если я правильно понимаю, что вы используете вашу модель напрямую, чтобы связать свои взгляды - верно?Если это так, я бы предложил вам создать ViewModels, копируя все из вашей модели и обратно.Это отделит модель от вида.Ваша ViewModel может предоставить гораздо больше информации, необходимой вашему View.См. Шаблон MVVM.

...