Почему MVC не привязывает мою вложенную коллекцию? - PullRequest
3 голосов
/ 02 октября 2010

Если у меня есть пара объектов linqTOsql, которые я пытаюсь редактировать с помощью формы.

Во-первых, есть класс Stream:

[Table]
public class Stream
{
    [HiddenInput(DisplayValue = false)]
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public long StreamID { get; set; }

    /*other properties removes for brevity*/

    // relationship (one stream to many Stream2FieldTypes) 
    // uses EntitySet<Stream2FieldTypes> and OtherKey for the FK in Stream2FieldTypes 
    private EntitySet<Stream2FieldTypes> _Stream2FieldTypes;
    [System.Data.Linq.Mapping.Association(Storage = "_Stream2FieldTypes", OtherKey = "StreamID")]
    public EntitySet<Stream2FieldTypes> Stream2FieldTypes
    {
        get { return this._Stream2FieldTypes; }
        set { this._Stream2FieldTypes.Assign(value); }
    }

}

Затем есть Stream2FieldTypesкласс:

[Table]
public class Stream2FieldTypes
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public long s2fID { get; set; }

    /*other properties removed for brevity*/

    [Column]
    public long StreamID { get; set; }     // FK




    // relationship (one Stream2FieldTypes to Streams) 
    private EntitySet<Stream> _Stream;
    [Association(Storage = "_Stream", ThisKey = "StreamID")]
    public EntitySet<Stream> Stream
    {
        get { return this._Stream; }
        set { this._Stream.Assign(value); }
    }
}

Я использую репозиторий linqTOsql, чтобы получить эти объекты и отправить их в представление следующим образом:

    public ActionResult StreamEdit(long id)
    {
        Genesis.Domain.Entities.Stream stream = genesisRepository.Streams.FirstOrDefault(x => x.StreamID == id);

        return View(stream);
    }

Все, что получает, отправляется в представление без проблем ...Но когда форма в представлении отправлена, Stream.Stream2FieldTypes по какой-то причине теряется.Я улавливаю отправку формы с помощью этого действия:

    [HttpPost]
    public ActionResult StreamEdit( long id, Genesis.Domain.Entities.Stream form)
    {

            return View(form);
    }

И представление без коллекции Stream2FieldTypes.

Представление записывает Stream2FieldTypes следующим образом:

<% for (int i = 0; i < (Model.Stream2FieldTypes != null ? Model.Stream2FieldTypes.Count() : 0); i++) %>
<% { %>
    <div class="ListItem">
        Label: <%: Html.EditorFor(x => x.Stream2FieldTypes[i].s2fLabel, new { style="width:100px" })%>
        Required: <%: Html.EditorFor(x => x.Stream2FieldTypes[i].s2fIsRequired)%>
        Field Type ID": <%: Html.EditorFor(x => x.Stream2FieldTypes[i].FieldTypeID, new { style="width:20px;" })%>
        Stream ID: <%: Html.EditorFor(x => x.Stream2FieldTypes[i].StreamID) %>
</div>
<% } %>

Почему механизм связывания моделей по умолчанию в mvc правильно связывает вложенную коллекцию?

1 Ответ

2 голосов
/ 02 октября 2010

Я бы порекомендовал вам использовать модели представления POCO вместо этих загроможденных классов моделей.Они не адаптированы к виду и с ними сложно работать.Попытка привязки к определенным коллекциям LINQ, таким как EntitySet<T>, не очень хорошая идея.Использование шаблона редактора на самом деле может работать, но даже если это работает, имейте в виду, что это должно быть временное решение, пока вы не введете правильные модели представлений.

В главном представлении замените цикл следующим образом:

<%: Html.EditorFor(x => x.Stream2FieldTypes) %>

, а затем добавьте строго типизированное частичное представление в ~/Views/Home/EditorTemplates/Stream2FieldTypes.ascx:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Stream2FieldTypes>" 
%>
<div class="ListItem">
    Label: 
    <%: Html.EditorFor(x => x.s2fLabel, new { style="width:100px" }) %>

    Required: 
    <%: Html.EditorFor(x => x.s2fIsRequired) %>

    Field Type ID: 
    <%: Html.EditorFor(x => x.FieldTypeID, new { style="width:20px;" })%>

    Stream ID: 
    <%: Html.EditorFor(x => x.StreamID) %>
</div>

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

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