【问题标题】:Binding, Prefixes and generated HTML绑定、前缀和生成的 HTML
【发布时间】:2010-03-23 01:44:53
【问题描述】:

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") %>

...以及我能想到的所有其他变体。

我似乎需要模型在两个方向上都知道前缀,但绑定仅在映射入站请求时适用。这似乎(对我来说)是一个常见的场景,但我正在努力寻找那里的例子。我错过了什么!

提前致谢。

【问题讨论】:

    标签: asp.net-mvc data-binding model prefix


    【解决方案1】:

    前缀在那里,因此您可以将对象包装在“外部”视图模型中。

    假设我们有:

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

    如果你使用这个类作为你的 ViewModel 和你的强类型视图的基础,那么你的强类型文本框将被这样命名:

    friend.Name
    foe.Name
    

    然后,您可以使用您在问题中引用的 Prefix 属性来消除您的 Friend 和 Foe 类之间的歧义。

    【讨论】:

    • 非常感谢,是的,Bind 属性仅适用于映射请求,我觉得这是错误的,但当时正抓着稻草!我没有考虑创建一个包装类来影响渲染。我必须承认,我并不完全愿意为域对象创建冗余包装器以使视图正常工作,但它确实解决了我的直接问题。如果能够在模型中指定适用于请求和响应的前缀,那就太好了。谢谢你让我重新开始!
    • 很高兴我能帮上忙。仅供参考-您没有必须创建 ViewModel,但它与 MVC 一起工作得更好,它有点迫使您编写更好的代码。问题不在于风格,而在于缺乏工具。 ViewModel 创建不应该是一个劳动密集型的过程,但它仍然是 ASP.NET MVC 的早期(和版本)......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2011-09-22
    相关资源
    最近更新 更多