当为创建和编辑等视图返回强类型模型时(当我们编辑的对象的验证失败时),我通常会准备这样的模型:
//
// GET: /Invoice/Create
public virtual ActionResult Create()
{
// prepare the empty model
Invoice model = new Invoice();
model.Client = new Client();
model.Client.PostCode = new PostCode();
return View(model);
}
//
// POST: /Invoice/Create
[HttpPost]
public virtual ActionResult Create(Invoice document,
FormCollection collection)
{
// check for errors
if (!ViewData.ModelState.IsValid)
{
document.Client = new Client();
document.Client.PostCode = new PostCode();
return View(document);
}
现在我知道其他人也是这样做的,事实上你可以在MVC Music Store样本中看到同样的方法。但是,这非常容易出错,因为可能会意外地遗漏了视图中所需的引用实体。它还需要过多考虑视图/模型交互。我想要的是某种自动化。模型中的值类型属性通常不是问题,因为它们默认为零或空字符串。然而,引用类型应该用new
初始化..但迟早我们最终会得到重复的代码块,遗漏引用类型属性等等。我不认为这是好的编码实践
我们可以采取哪些其他选择?
更新
因为回复有点遗漏了这一点(他们没有放心我们以任何方式思考模型并需要模型类中的其他代码),我在想这个选项是否有效:
OnActionExecuted()
我已经部分实施了步骤1,2和3但我无法弄清楚如何做“... = new Client();”用反射编程。
答案 0 :(得分:1)
如果模型的属性为null,则使其返回一个新实例
private Client client;
public Client Client
{
get
{
if (client == null)
client = new Client();
return client;
}
}
答案 1 :(得分:1)
我建议您使用绑定到ViewModel的强类型视图,该视图与您尝试创建的域模型不同,并将任何必要的逻辑放入ViewModel的构造函数中
答案 2 :(得分:0)
我不确定我完全理解你的问题。你想要什么自动化? ViewModels和Views?你在创建强类型视图吗?
我创建了一个T4模板,我指向一个数据库,它为每个表生成一个ViewModel。外键变为下拉列表,长字符串获取TextArea而不是TextBox等。然后删除我不需要的那些并修改我想要保留的那些。这不是一个完全自动化的过程,但它可以完成80%到90%的工作,具体取决于项目。
然后我从那些ViewModel生成强类型视图。
听起来您可能对AutoMapper感兴趣。