【问题标题】:Add prefixes to id's and names of viewmodel fields为视图模型字段的 id 和名称添加前缀
【发布时间】:2014-02-07 09:08:55
【问题描述】:

在我的项目中,我使用了很多动态加载的视图/表单。在我的表单中,使用@Html.TextBoxFor() 生成了很多字段,然后在我的javascript 逻辑中使用了@Html.IdFor(), @Html.NameFor()

我的一些视图模型具有相同名称的字段(ID、名称、描述等),所以如果我在 1 页上有 2 个具有此类视图模型的表单,那么我就有问题(相同的 id 属性用于超过一个元素)。

所以我想知道是否可以将一些服务器端元数据/属性添加到我的视图模型中,并带有将添加到生成的 ID 和名称的前缀?或者,如果有其他解决方案不需要重命名我的视图模型或视图。

【问题讨论】:

  • 您可以通过使用编辑器模板来减少此问题的发生。要自己控制行为,您可以设置ViewData.TemplateInfo.HtmlFieldPrefix。然后,您需要指示模型绑定器使用什么前缀,因此如果您混合字段前缀,这可能会变得很棘手。示例:public ActionResult _Edit( [Bind( Prefix = "MyPrefix" )] AModel model )
  • 看起来这将需要在动作(或复制动作)中传递整个模型,在我的情况下这看起来不是一个好方法。

标签: c# asp.net-mvc asp.net-mvc-5 razor-3


【解决方案1】:

尝试使用:

    @Html.TextBoxFor(m => m.id,new {@class="class",id=[but here the id you want]})

【讨论】:

    【解决方案2】:

    您可以在 javascript 代码中使用输入的“名称”属性...这些属性是自动生成的。

    如果您有这样的组合 ViewModel:

    public class MyViewModel{
       public MySecondModel Sencond {get; set;}
       public MySecondModel Third {get; set;}
    }
    
    public class MySecondModel {
       public string Name {get; set;}
       public string Description {get; set;}
    }
    

    然后你像这样在你的视图中使用它:

    @Html.TextBoxFor(x => x.Second.Name)
    @Html.TextBoxFor(x => x.Third.Name)
    

    名称属性将变为:“Second_Name”和“Third_Name

    所以……它不会重复。

    【讨论】:

    • 我的错,我想我没有很好地解释这个问题。我的视图模型没有组合。他们是分开的。假设我在带有Id, Name, etc 字段的页面上有Employee 编辑视图,并且在同一页面上通过ajax 用户决定加载表单以创建带有Id, Name, etc 字段的新Department。假设EmployeeDepartment 控制器不相关。
    • 好的。然后,就像在您应该使用 ViewModels 的视图中一样,您可以使用前缀重命名属性……然后模型可以保留具有原始重复值的属性。这不是技术建议,但会起作用:)
    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2012-06-18
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多