我的礼物控制器有一个动作结果,它在参数中使用一个 GiftViewModel 来检查模型状态。
我刚刚向 GiftViewModel 添加了 LoginModel 属性。我想测试这个属性的模型状态。
礼品视图模型.cs:
public class GiftViewModel
{
public LoginModel login { get; set; }
[...]
}
Run Code Online (Sandbox Code Playgroud)
礼品控制器.cs
//
// POST: /Gift/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(GiftViewModel model, string returnUrl)
{
// here instead of the overall modelstate
// I would like to check only the modestate of the login property
// of my model
if (ModelState.IsValid && WebSecurity.Login(model.login.Email, model.login.Password, persistCookie: model.login.RememberMe))
{
return View("Index", model);
}
return View("Index", model);
}
Run Code Online (Sandbox Code Playgroud)
我该如何管理?
如果您只想检查属性的有效性,那么如何使用:
var propertyToValidate = ModelState["PropertyName"];
if(propertyToValidate==null || //exclude if this could not happen or not to be counted as error
(propertyToValidate!=null && propertyToValidate.Errors.Any())
)
{
//Do what you want if this value is not valid
}
//Rest of code
Run Code Online (Sandbox Code Playgroud)
但请注意,在这种情况下,模型的其余部分已经过验证。您只是在检查 ModelState 的其余部分之前检查此属性的有效性。如果您想先进行实际验证,则必须在 GiftViewModel 的自定义 ModelBinder 中实现。
我做了一个模型状态扩展,这使它变得非常简单:
public static class ModelStateDictionaryExtensions
{
/// <summary>
/// Returns true when a model state validation error is found for the property provided
/// </summary>
/// <typeparam name="TModel">Model type to search</typeparam>
/// <typeparam name="TProp">Property type searching</typeparam>
/// <param name="expression">Property to search for</param>
/// <returns></returns>
public static bool HasErrorForProperty<TModel, TProp>(this System.Web.Mvc.ModelStateDictionary modelState,
Expression<Func<TModel, TProp>> expression)
{
var memberExpression = expression.Body as MemberExpression;
for (int i = 0; i < modelState.Keys.Count; i++)
{
if (modelState.Keys.ElementAt(i).Equals(memberExpression.Member.Name))
{
return modelState.Values.ElementAt(i).Errors.Count > 0;
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
使用上述方法,您只需输入:
if (ModelState.HasErrorForProperty<GiftViewModel, LoginModel >(e => e.login))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8358 次 |
| 最近记录: |