[英]Preparing models for ASP.NET MVC views
当为创建和编辑等视图返回强类型模型时(当我们正在编辑的 object 的验证失败时)我通常准备这样的模型:
//
// 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
..初始化。但迟早我们会得到重复的代码块,引用类型属性被遗漏等等。我也不认为这是一个好的编码实践。
我们还可以采取哪些其他选择?
更新:
因为回复有点错过了重点(它们不会让我们以任何方式思考模型,并且需要在 model 类中添加额外的代码),我在想这个选项是否可行:
OnActionExecuted()
我已经部分实施了步骤 1、2 和 3,但我无法弄清楚如何执行“... = new Client();” 以编程方式使用反射。
使您的 model 的属性返回一个新实例,如果它是 null
private Client client;
public Client Client
{
get
{
if (client == null)
client = new Client();
return client;
}
}
我建议您使用绑定到与您尝试创建的域 Model 不同的 ViewModel 的强类型视图,并将任何必要的逻辑放入 ViewModel 的构造函数中
我不确定我是否完全理解你的问题。 你想要什么自动化? 视图模型和视图? 您是否正在创建强类型视图?
我创建了一个指向数据库的 T4 模板,它为每个表生成一个 ViewModel。 外键变成下拉列表,长字符串得到一个 TextArea 而不是 TextBox,等等。然后我删除我不需要的那些并修改我想要保留的那些。 这不是一个完全自动化的过程,但它会完成 80% 到 90% 的工作,具体取决于项目。
然后我从这些 ViewModel 生成强类型视图。
听起来您可能对AutoMapper感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.