检查属性的模型状态

Cac*_*tus 3 c# asp.net-mvc-4

我的礼物控制器有一个动作结果,它在参数中使用一个 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)

我该如何管理?

JTM*_*Mon 5

如果您只想检查属性的有效性,那么如何使用:

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 中实现。


Ian*_*Ian 5

我做了一个模型状态扩展,这使它变得非常简单:

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)