2010-03-23 73 views
3

MVC新手问题绑定器。假如我有两个强类型碰巧有一个同名的模型属性局部行动,并在同一个包含页面即呈现:绑定,前缀和生成的HTML

Class Friend {string Name {get; set ;} DateTime DOB {get; set ;}} 
Class Foe {string Name {get; set ;} string ReasonForDislike {get; set ;}} 

两个泛音将有一行:

<%= Html.TextBoxFor(model => model.Name) %> 

和相关的控制器操作:

public ActionResult SaveFriend(Friend friend) 
public ActionResult SaveFoe(Foe foe) 

我的问题是,无论是将呈现包含我的网页上使用相同的ID(当然,坏的原因很多)。我知道[绑定]属性,允许我添加前缀,导致代码:

public ActionResult SaveFriend([Bind(Prefix = “friend”)] Friend friend) 
<%= Html.TextBox("friend.Name", Model. Name) %> //Boo, no TextBoxFor :(

但是,这仍然不能削减它。我只差一点就容忍强类型TextBoxFor佣工的损失,但我还没有得到客户端验证与前缀的工作: 我已经试过:

<%= Html.ValidationMessage("friend.Name") %> 

......和所有其他变种我能想到的。

我似乎需要模型知道在两个方向的前缀,但绑定仅适用于映射入站请求。在我看来,这是一种常见的情况,但我正在努力寻找那些例子。我错过了什么!

在此先感谢。

回答

2

前缀在那里,所以你可以将你的对象包裹在一个“外部”ViewModel中。

假设我们有:

public class MyViewModel 
{ 
    public Friend friend; 
    public Foe foe; 
} 

如果你使用这个类作为您的视图模型,并为您的强类型的意见,那么你的强类型的文本框将被正是如此命名的基础:

friend.Name 
foe.Name 

然后,您可以使用您在问题中引用的前缀属性来消除朋友和敌人类之间的歧义。

+0

非常感谢,是的绑定属性仅用于映射请求,我觉得这是错误的,但在这一点上抓着吸管!我没有考虑创建一个包装类来影响渲染。我必须承认,为了让视图正常工作而为域对象创建多余的包装并不是一件容易的事,但它肯定能解决我眼前的问题。能够在应用于请求和响应的模型中指定前缀将会很好。 谢谢你让我再次跑步! – Vman 2010-03-23 11:27:59

+1

很高兴我能帮到你。仅供参考 - 您不必*创建ViewModels,但它在MVC上运行得更好,它有点迫使您编写更好的代码。问题不在于风格,而在于缺乏工具。 ViewModel的创建不应该是这样一个劳动密集型的过程,但它仍然是ASP.NET MVC的早期版本(和版本)...... – 2010-03-23 12:39:44