C# MVC ModelState.IsValid=true,需要null属性

C# MVC ModelState.IsValid=true,需要null属性,c#,asp.net-mvc,C#,Asp.net Mvc,我有这个型号 public class ModelVM { private string _rD; [Required] public string RD { get { return _rD; } set { _rD = RCodes.Contains(value)? value : null; } }

我有这个型号

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"
    };
}
我发送:
{RD:“无论什么”}

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


你知道MVC为什么这么做吗?或者我的代码有什么问题?

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");
}

在调试过程中,如果在if语句上设置断点,
modelVM.RD
中存储了什么值。
ModelState.IsValid
告诉您是否有任何模型错误被添加到
ModelState
。在这种情况下,这是正确的,因为ModelState中没有错误。你说你发了
{RD:“随便”}
。默认模型绑定器将查看发送的数据,并将属性与预期类型匹配。从绑定的角度来看,
[Required]
验证得到满足,因为当绑定器查看字典时,传入数据中提供了所需的属性
RD
。Hrmm,我不想这样做,但我想,我必须这样做。你知道为什么WebApi控制器使用相同的逻辑([必需],_rD=RDCodes.ValidMethod…)ModelState.IsValid=false吗?代码看起来可能相同,使用方式也相同,但web api中使用的逻辑与MVC中的不一样。这就是为什么在vNext版本中,他们将代码库合并回一个。
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");
}