模型Binder非常奇怪的错误

时间:2015-01-18 23:45:21

标签: c# asp.net asp.net-mvc-5 model-binding

我遇到了默认模型Binder的问题,它以一种非常奇怪的方式运行。我试图将一些数据发送到控制器操作,并期望这些数据字段绑定到我编码的视图模型类。

这是View模型类:

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,这是到达服务器的请求

Fiddler request

但是当我运行代码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."}

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

1 个答案:

答案 0 :(得分:2)

问题是您的视图模型包含属性名称model,并且您的POST方法具有相同名称的参数。将参数更改为模型的属性名称以及其将被正确绑定的任何其他参数。 e.g。

public ActionResult SaveCashRegister(CashRegisterViewModel viewModel)

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