Model Binder 非常奇怪的错误

Model Binder very strange error

我的默认 Model Binder 有问题,它的行为非常奇怪。我正在尝试 POST 一些数据到控制器操作,并期望这些数据字段将绑定到我编码的视图模型 class。

这是视图模型class:

public class CashRegisterViewModel
{
    [Required]
    [Display( Name = "CashRegisterID" )]
    public int CashRegisterID { get; set; }

    [Required]
    [Display( Name = "RegisterCode" )]
    public string RegisterCode { get; set; }

    [Required( AllowEmptyStrings = true )]
    [Display( Name = "Cash model" )]
    public string Model { get; set; }

    [Required( AllowEmptyStrings = true )]
    [Display( Name = "Concept" )]
    public string Concept { get; set; }

    [Required( AllowEmptyStrings = true )]
    [Display( Name = "IP Address" )]
    public string IPAddress { get; set; }

    [Required( AllowEmptyStrings = true )]
    [Display( Name = "External Cash Register Code" )]
    public string ExternalCashRegisterCode { get; set; }

    [Required]
    [Display( Name = "PoS ID" )]
    public int PoSID { get; set; }
}

这是控制器动作方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveCashRegister( CashRegisterViewModel model ) {
    if ( ModelState.IsValid ) {
        [...]
    }
}

查看 Fiddler 这是到达服务器的请求

然而,当我 运行 时,代码 ModelState.IsValid 总是错误的,如果我查看 ModelState,我会看到以下错误

{"The parameter conversion from type 'System.String' to type 'MyProject.ViewModel.Common.CashRegisterViewModel' failed because no type converter can convert between these types."}

有人可以对此行为提出任何建议吗?

问题是您的视图模型包含一个 属性 名称 model 并且您的 POST 方法有一个同名参数。将参数更改为您模型的 属性 名称以外的任何内容,它将被正确绑定。例如

public ActionResult SaveCashRegister(CashRegisterViewModel viewModel)

内部发生的情况是您的表单集合包含一个值 model:"IBM 4846E65"DefaultModelBinder 然后查找名为 model 的 属性 来设置它的值。如果找到您的参数,它会尝试 CashRegisterViewModel model = "IBM 4846E65"; 这当然会失败(您不能将字符串分配给复杂对象)并且绑定失败(并且您的模型是 null