MVC ModelState.IsValid = true,具有null必需属性

时间:2016-04-30 00:10:06

标签: c# asp.net-mvc

我有这个模型

public class ModelVM
{
    private string _rD;
    [Required]
    public string RD
    {
        get
        {
            return _rD;
        }
        set
        {
            _rD = RCodes.Contains(value)? value : null;
        }
    }

    private static List<string> RCodes = new List<string>
    {
        "OK",
        "OTHER",
        "ANOTHER"
    };
}

在我的MVC控制器中

public class MyController : Controller
{
    public ActionResult Index(ModelVM modelVM, FormCollection collection)
    {

        if (!ModelState.IsValid)
            return Json(new
            {
                Result = "ERROR",
                Message = "Missing fields."
            });

        return Json("OK");
    }
}

我发送:{ RD: "Whatever" }

并在调试ModelState.IsValid=true。我在WebApi控制器上有类似的代码,并按预期工作(modelstate.valid=false

你有什么想法为什么MVC会这样做?或者我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

ModelState.IsValid告诉您是否已将任何模型错误添加到ModelState。

在这种情况下,它是有效的,因为提供的数据中没有客户端错误会影响ModelState。

你说......

  

我发送了{RD:“随便”}

...这意味着模型绑定器将查看发送的数据并将属性与预期类型匹配。从模型绑定的角度来看,[Required]验证得到满足,因为当绑定器查看所需属性RD的路由值字典时,它是由客户端在传入数据中提供的。

如果您想手动使州无效......

public ActionResult Index(ModelVM modelVM, FormCollection collection)
{
    if(ModelState.IsValid) {
        if(modelVM.RD == null) {
            ModelState.AddModelError("RD", "RD is invalid.");
        }
    }

    if (!ModelState.IsValid)
        return Json(new
        {
            Result = "ERROR",
            Message = "Missing fields."
        });

    return Json("OK");
}