【发布时间】:2012-01-10 01:57:17
【问题描述】:
我有一个视图模型发送到我的控制器的编辑操作。 ViewModel 包含对 EntityObjects 的引用。 (是的,我很好,不需要复制视图模型中的所有实体属性)。
我实例化视图模型,然后调用 UpdateModel。我收到一个属性为“null”的错误,这很好,因为它是一个相关模型。我试图在模型绑定期间排除该属性的绑定。在调试它时,我在模型绑定器试图将属性值设置为 null 的实体中看到。
这是我的编辑操作:
var model = new SimplifiedCompanyViewModel(id);
var excludeProperties = new string[] {
"Entity.RetainedEarningsAccount.AccountNo"
,"Property.DiscountEarnedAccount.ExpenseCodeValue"
,"Entity.EntityAlternate.EntityID"
,"Property.BankAccount.BankAccountID"
,"Entity.PLSummaryAccount.AccountNo"
,"Property.RefundBank.BankAccountID"
,"Company.Transmitter.TCC"
};
try
{
UpdateModel<SimplifiedCompanyViewModel>(model, String.Empty, null, excludeProperties);
if (ModelState.IsValid)
{
//db.SaveChanges();
}
return RedirectToAction("Index");
}
catch
{
return View(model);
}
我已经查看了有关指定“前缀”的其他一些问题,但我认为这不是问题,因为我告诉它绑定到 viewmodel 实例而不仅仅是实体对象。
我是否正确排除了属性?奇怪的是似乎只发生在这个项目上。我怀疑这可能是一个问题,因为实际上没有与我的实体相关的退款银行。但是我有其他不存在的相关项目并且没有看到相同的问题。
更多信息...因为有人告诉我模型设计得不好。
公司与银行账户相关。公司视图显示当前相关的 BankAccount.BankAccountId,并且有一个带有 BankAccount.Key 的隐藏字段。 I use jQueryUI autocomplete feature to provide a dropdown of bank account displaying the BankAccount.BankAccountId and when one is selected the jQuery code changes the hidden field to have the correct Key value.因此,当发布此内容时,我不希望修改当前的银行帐户 BankAccountID,因此我希望它跳过绑定该字段。
如果我在模型中排除 BankAccountId,那么在 BankAccount 编辑视图中,用户将永远无法更改 BankAccountId,因为它不会被绑定。我不确定这如何表明模型设计不佳。
【问题讨论】:
-
你可能会接受它,但你会让自己面临潜在的麻烦。如果新的值被添加到您的实体中,而您在未来不考虑怎么办?假设您添加了一个名为“DiscountRate”的字段(假设)并且最终用户看到它在其他地方使用,他们可以在表单中包含此值和注入你的模型。还有很多其他使用 ViewModel 的原因。复制属性通常是简单的复制/粘贴/清理,它不适用于这里的 DRY 原则。
-
好吧,你一针见血。对我来说似乎不是很干。
-
DRY 通常适用于逻辑,不适用于视图模型。一个视图 = 一个视图模型。使用 automapper 在它们之间轻松映射。 Jimmy Bogard 有一个很好的属性,这使得它几乎是自动的——例如,您创建视图模型,加载您的客户实体,然后在操作方法中返回它。然后 AutpMap 属性会将其转换为 ViewModel。见lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models
-
如果 ViewModel 与 Model 相同,对我来说似乎并不干燥。然而,这是一个如此复杂的视图,它使用了几个相关的实体,我可能不得不求助于这样做。我只是不确定自动映射器或其他东西将如何处理所有关系,我可能不得不手动编写所有更新代码。我会看看你上面列出的文章。
-
是的,如果它是手动的,那么您不必担心那时绑定的bankaccount.name。
标签: asp.net-mvc-3 model-binding