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

StackOverflow https://stackoverflow.com/questions/1876781

Вопрос

Допустим, у меня есть представление редактирования, которое строго типизировано для таблицы под названием «MyData».Представление имеет несколько вкладок, каждая из которых содержит несколько разных полей из таблицы.Для повышения производительности данные загружаются только при просмотре вкладки, поэтому, если вы отредактируете поле только на вкладке 1 и отправите форму, данные для вкладки 2 не будут загружены.

Проблема, с которой я столкнулся, связана с отправкой.Я выполняю типичную процедуру поиска существующей записи в базе данных и обновления переданных значений:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult

    Using dc = New MyDataContext
        Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
        orig.name = data.name
        orig.desc = data.desc
        ...
        SubmitChanges()
    End Using

    Return View(orig)

End Function

Однако этот метод не знает, какие вкладки были загружены, поэтому, если вкладка с надписью «desc» не загружена, этот метод считает, что пользователь заполнил поле «desc», и отправляет NULL в базу данных.

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

Это было полезно?

Решение

Есть ли причина, по которой вы не используете UpdateModel(orig)?

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

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

Другие советы

Я бы рекомендовал иметь отдельный метод действия для каждой вкладки, который просто обновляет поля на этой вкладке.Форма на каждой вкладке будет просто отправлена ​​на соответствующее действие.

Возможно, здесь вам поможет шаблон ViewModel, где вы разделяете исходную модель, например, представления вкладок, например:

public class Tab1 
    {
        public string pproperty1 { get; set; }
        public string pproperty2 { get; set; }
    }
    public class Tab2
    {
        public string pproperty3 { get; set; }
        public string pproperty4 { get; set; }
    }
    public class Tab3
    {
        public string pproperty5 { get; set; }
        public string pproperty6 { get; set; }
    }
    public class ViewModels
    {
        public Tab1 TAB1 { get; set; }
        public Tab2 TAB2 { get; set; }
        public Tab3 TAB3 { get; set; }
    }

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

ПД:Извините за C #, я уже давно видел, как я кодировал vb.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top