MVC.NET - Обновление EntitySet в модели - PullRequest
0 голосов
/ 10 ноября 2010

В настоящее время я работаю над представлением обновлений для модели, имеющейся в ASP.NET MVC. Модель называется Document и имеет дочерние ссылки:

[Association(ThisKey = "AssetID", OtherKey = "AssetID")]
private EntitySet<Link> links = new EntitySet<Link>();
public IQueryable<Link> Links
{
    get { return links.AsQueryable().Select(l => l); }
    set 
    {
        links.Assign(value);
    }
}

У меня есть строго типизированная форма обновления, корректно отображающая модель (включая все ссылки) через шаблон EditorTemplate для ссылки, а затем с использованием Html.EditorFor(model => model.links). Это успешно захватывает и отображает все ссылки для данного документа.

Когда форма отправляется, и я использую Fiddler для просмотра данных, которые публикуются обратно, для каждой ссылки она содержит все поля, такие как Links [0] .Id = 12323, Links [0] .DisplayOrder = 1 и т. Д.

Проблема, однако, заключается в том, что когда я ставлю точку останова на метод контроллера, который я публикую, и проверяю объект Document, который публикуется, его коллекция Links пуста. Я попытался добавить дополнительные свойства привязки к моему контроллеру, как описано здесь , но безуспешно - аргумент, передаваемый параметру, всегда равен нулю.

Есть идеи, почему моя модель не содержит этих ссылок, когда я пытаюсь ее обновить? Спасибо

1 Ответ

2 голосов
/ 10 ноября 2010

Причина, по которой это происходит, проста: вы не используете модели представлений, что я бы порекомендовал.Позвольте мне уточнить.По вашему мнению, вы напрямую используете свои модели данных, которые не являются объектами POCO, а использование Linq to SQL еще больше загрязняет их этими EntitySet<T> компонентами, специфичными для вашего DAL, и просто смотрите на установщик свойства Links: links.Assign(value);,Не ожидайте от связующего устройства модели по умолчанию быть таким умным.Представление никогда не должно работать с такими вещами, как EntitySet<T> (это детали реализации).

Итак, начните с определения модели представления POCO, которая выражает намерение представления, которое редактирует ссылки:

public class MyViewModel
{
    // As you can see the sole responsibility of the view is to 
    // show a list of input fields for each link to be edited.
    // TODO: you could also have a view model for Link the same way 
    public IEnumerable<Link> { get; set; }
}

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

Фактически каждый раз, когда я вижу вопрос о SO, помеченный как asp.net-mvc и linq-to-sql (или объектомрамки) я знаю, что что-то не так.Эти две вещи должны быть совершенно отдельными и не иметь ничего общего.Ваш DAL должен быть удален в репозитории, чтобы MVC никогда не знал о используемой вами технологии доступа к данным.

Обычный сценарий будет следующим:

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

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