Причина, по которой это происходит, проста: вы не используете модели представлений, что я бы порекомендовал.Позвольте мне уточнить.По вашему мнению, вы напрямую используете свои модели данных, которые не являются объектами 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 никогда не знал о используемой вами технологии доступа к данным.
Обычный сценарий будет следующим:
Действие контроллера получает модель представления в качестве аргумента, проверяет ее, сопоставляет эту модель представления с некоторой моделью и вызывает некоторый метод из репозитория, передающего модель.Хранилище возвращает другую модель, которая, в свою очередь, преобразуется в модель представления и передается в представление для визуализации (конечно, это полный сценарий, есть случаи, когда можно пропустить шаги для простых действий).