我正在使用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?
注意:
答案 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)
简答:你不能,不能使用默认的数据注释。
更长的答案:您有几种选择。