我遇到了默认模型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,这是到达服务器的请求
但是当我运行代码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."}
有人可以就此行为提出任何建议吗?
答案 0 :(得分:2)
问题是您的视图模型包含属性名称model
,并且您的POST方法具有相同名称的参数。将参数更改为模型的属性名称以及其将被正确绑定的任何其他参数。 e.g。
public ActionResult SaveCashRegister(CashRegisterViewModel viewModel)
内部发生的事情是您的表单集合包含值model:"IBM 4846E65"
。然后DefaultModelBinder
会查找名为model
的属性来设置其值。如果找到您的参数,那么它会尝试CashRegisterViewModel model = "IBM 4846E65";
当然失败(您无法将字符串分配给复杂对象)并且绑定失败(并且您的模型为null
)