MVC新手问题重新绑定。假设我有两个强类型的部分动作碰巧有一个具有相同名称的模型属性,并且在相同的包含页面中呈现,即:。
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(当然,由于很多原因而不好)。我知道[Bind]属性允许我添加前缀,导致代码:
public ActionResult SaveFriend([Bind(Prefix = “friend”)] Friend friend)
<%= Html.TextBox("friend.Name", Model. Name) %> //Boo, no TextBoxFor :(
但这仍然没有削减它。我可以容忍丢失强类型的TextBoxFor助手,但我还没有得到客户端验证来使用前缀: 我试过了:
<%= Html.ValidationMessage("friend.Name") %>
......以及我能想到的其他变体。
我似乎需要模型知道两个方向上的前缀,但绑定仅适用于映射入站请求。看来(对我来说)是一个常见的场景,但我很难找到那里的例子。我错过了什么!
提前致谢。
答案 0 :(得分:2)
前缀是存在的,因此您可以将对象包装在“外部”ViewModel中。
假设我们有:
public class MyViewModel
{
public Friend friend;
public Foe foe;
}
如果您将此类用作ViewModel并作为强类型视图的基础,那么您的强类型文本框将被命名为:
friend.Name
foe.Name
然后,您可以使用您在问题中引用的前缀属性来消除您的朋友和敌人类别之间的歧义。