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

Mor*_*eza 8 validation asp.net-mvc

我正在使用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; } 
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

如何防止在TryUpdateModel中检查LastName的检查?

注意:

  • 代码是简化的.我真正的代码很复杂
  • 我必须使用Requierd for Two Property
  • 我不想使用不同的模型类

Mor*_*eza 17

我找到了Nice Solution.我必须从ModelState中删除未使用的Field.然后ModelState.IsValid返回true.首先我需要Create New Attribute类:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Pri*_*nka 15

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

ModelState.Remove("Email");
if (ModelState.IsValid)
{
   // whatever you want to do
}
Run Code Online (Sandbox Code Playgroud)


Des*_*ond 7

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

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