ASP.NET MVC - альтернатива для [Bind (Exclude = "Id")] - PullRequest
18 голосов
/ 08 января 2011

Есть ли альтернатива для [Bind(Exclude = "Id")] ( Связанный вопрос) ?

Могу ли я написать связующее для моделей?

Ответы [ 5 ]

31 голосов
/ 08 января 2011

Да, есть: это называется просмотр моделей.Модели представлений - это классы, которые специально адаптированы к конкретным потребностям данного представления.

Поэтому вместо:

public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model)

используйте:

public ActionResult Index(SomeViewModel viewModel)

, где представлениеМодель содержит только те свойства, которые необходимо связать.Затем вы можете отобразить между моделью представления и моделью.Это сопоставление можно упростить с помощью AutoMapper .

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

13 голосов
/ 01 ноября 2012

Очень простое решение, которое я понял.

public ActionResult Edit(Person person)
{
    ModelState.Remove("Id"); // This will remove the key 

    if (ModelState.IsValid)
       {
           //Save Changes;
       }
    }
}
11 голосов
/ 24 января 2018

Вы можете исключить свойства напрямую с помощью атрибута, используя;

[BindNever]
6 голосов
/ 10 февраля 2016

В дополнение к существующим ответам, C # 6 позволяет исключить свойство более безопасным способом:

public ActionResult Edit(Person person)
{
    ModelState.Remove(nameof(Person.Id));

    if (ModelState.IsValid)
       {
           //Save Changes;
       }
    }
}

или

public ActionResult Index([Bind(Exclude = nameof(SomeDomainModel.Id))] SomeDomainModel model)
3 голосов
/ 12 июня 2014

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

    /// <summary>
    /// Excludes the list of model properties from model validation.
    /// </summary>
    /// <param name="ModelState">The model state dictionary which holds the state of model data being interpreted.</param>
    /// <param name="modelProperties">A string array of delimited string property names of the model to be excluded from the model state validation.</param>
    public static void Remove(this ModelStateDictionary ModelState, params string[] modelProperties)
    {
        foreach (var prop in modelProperties)
            ModelState.Remove(prop);
    }

Вы можете использовать еговот так в вашем методе действий:

    ModelState.Remove(nameof(obj.ID), nameof(obj.Prop2), nameof(obj.Prop3), nameof(obj.Etc));
...