我一直试图以最清洁的方式解决这个问题。
如何在为复杂类型提交空字符串时让模型绑定器不创建空对象?
说我有这个型号:
public class CreateCaseModel
{
[Required]
public UserModel Contact { get; set; }
public UserModel Assigned {get; set; }
}
和用户模型:
public class UserModel {
[Required]
public string Id {get;set;}
public string Name {get;set;
}
在视图中我有这些输入:
<input type="hidden" name="Assigned.Id" value="" />
<input type="hidden" name="Contact.Id" value="userId1" />
我把它发布到控制器上,如:
public ActionResult Create(CreateCaseModel model){
if (!ModelState.IsValid)
{
//handle error
}else {
//create
}
}
在控制器中,我的model.Contact
和model.Assigned
永远不会为空。
但是只有model.Contact
会包含任何内容(Id
将被设置)
此时,由于UserModel.Id字段被标记为必需,因此模型状态也将无效。
我想要发生的是,如果输入为空,则绑定器根本不创建UserModel对象。
我需要这个的全部原因是我在视图的其他地方使用UserModel.Name字段,我想将这两个字段组合在一起。我想使用ModelState.IsValid
检查服务器端验证。
我当然可以提取每个userobjects的Id和Name字段并将它们直接放在CreateCaseModel中,但我想探索我所描述的内容是否可行。
感谢任何提示或指示!
答案 0 :(得分:2)
如何在为复杂类型提交空字符串时让模型绑定器不创建空对象?
编写自己的custom ModelBinder。默认的模型绑定器将始终尝试为递归模型绑定创建复杂类型。