C# ASP.NET MVC-[Bind(Exclude=";Id";)的备选方案

C# ASP.NET MVC-[Bind(Exclude=";Id";)的备选方案,c#,asp.net-mvc-2,modelbinders,C#,Asp.net Mvc 2,Modelbinders,对于[Bind(Exclude=“Id”)]( 我可以写一个模型活页夹吗?是的,有:它被称为视图模型。视图模型是专门为给定视图的特定需求定制的类 因此,不是: public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model) 使用: 其中视图模型只包含需要绑定的属性。然后,您可以在视图模型和模型之间进行映射。此映射可以使用简化 作为最佳实践,我建议您始终使用视图模型往返于视图。我想出了一个非常简单的解决方案 publ

对于
[Bind(Exclude=“Id”)]


我可以写一个模型活页夹吗?

是的,有:它被称为视图模型。视图模型是专门为给定视图的特定需求定制的类

因此,不是:

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

其中视图模型只包含需要绑定的属性。然后,您可以在视图模型和模型之间进行映射。此映射可以使用简化


作为最佳实践,我建议您始终使用视图模型往返于视图。

我想出了一个非常简单的解决方案

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

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

正如Desmond所说,我发现remove非常容易使用,而且我做了一个简单的扩展,可以方便地忽略多个道具

    /// <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);
    }

作为对现有答案的补充,C#6使得以更安全的方式排除该财产成为可能:

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

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


可以使用直接使用属性排除属性

[BindNever]

+1这是我见过的关于ViewModel vs Business model的最好的描述。我从来没有从安全的角度考虑过它。但这就是使用视图模型的原因,至少对于http来说是这样。@Rookian,是的,有单独的视图模型是一个好的做法。@Darin:所以当你有一个包含许多属性的大型、复杂的域对象图时RTE(以及关系、验证规则等)这需要在表单上显示,您是否重新定义视图模型中的所有相关属性,手动复制它们之间的所有属性,等等?这似乎会导致大量重复、硬依赖和冗余代码,因此我一直在避免它,就像瘟疫一样-尽管它看起来是“正确的”方法,在实践中,我看不出你会如何避免所有尴尬的重复和重复…@Darin:但是你正在从你的域模型中复制视图中需要的所有属性,对吗?验证注释呢,你是复制所有这些,还是只在视图上有验证注释dels?(谢谢分享!)@mindplay.dk,我只复制我在视图上需要的内容。就验证而言,我在视图模型上执行验证。我使用FluentValidation.NET进行验证。不必为数据注释操心。我喜欢这个答案,但我仍然认为您应该使用和,关于设计模式和。如果您想排除t,您会如何做其中两个?
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)
[BindNever]