Asp.net MVC 3验证在TryUpdateModel中排除了一些字段验证

时间:2012-03-07 15:14:30

标签: asp.net-mvc validation

我正在使用ASP.NET MVC Razor和Data Annotation验证器 我的模特:

public class Person 
{ 
    public int id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

FirstName和LastName是Requerd。 我想编辑FirstName。我的Methode是:

public ActionResult Edit([Bind(Include = "FirstName")]Person person)
{
    var p = GetPerson();
    if (TryUpdateModel(p))
    {
        //Save Changes;
    }
}

但是TryUpdateModel总是返回false。因为LastName无效。

如何防止在TryUpdateModel中检查LastName?

注意:

  • 代码简化。我的真实代码很复杂
  • 我必须使用Requierd For Two Property
  • 我不想使用不同的模型类

4 个答案:

答案 0 :(得分:17)

我找到了Nice Solution。我必须从ModelState中删除未使用的Field。然后ModelState.IsValid返回true。首先我需要创建新属性类:

public class ValidateOnlyIncomingValuesAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var modelState = filterContext.Controller.ViewData.ModelState;
        var valueProvider = filterContext.Controller.ValueProvider;

        var keysWithNoIncomingValue = modelState.Keys.Where( x=>!valueProvider.ContainsPrefix(x) );
        foreach (var key in keysWithNoIncomingValue)
            modelState[key].Errors.Clear();
    }
}

然后我在我的方法上添加属性:

[ValidateOnlyIncomingValuesAttribute]
public ActionResult Edit([Bind(Include = "FirstName")]Person person)
{
    var p = GetPerson();
    if (ModelState.IsValid)
    {
        TryUpdateModel(p);
        //Save Changes;
    }
}

看看这个:http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

答案 1 :(得分:14)

您可以在检查模型是否有效之前删除不需要的属性

ModelState.Remove("Email");
if (ModelState.IsValid)
{
   // whatever you want to do
}

答案 2 :(得分:7)

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

public ActionResult Edit(Person person)
{
    ModelState.Remove("FirstName"); // This will remove the key 
    var p = GetPerson();
    if (TryUpdateModel(p))
       {
           //Save Changes;
       }
    }
}

答案 3 :(得分:4)

简答:你不能,不能使用默认的数据注释。

更长的答案:您有几种选择。

  1. 您可以创建自己的验证器注释。
  2. 您可以使模型类继承自IValidatableObject,然后实现Validate方法。 (但是,这不会进行客户端验证)。
  3. 您可以使用第三方验证库,例如FluentValidation。
  4. 您可以为此方案创建不同的模型。
  5. 您可以删除验证,只需在操作方法中添加代码,以检查字段是否正确。 (不建议这样做,因为这会增加控制器操作的复杂性,并且您必须在使用此模型的任何地方复制此功能)。