Asp.net mvc如何使用htmlhelper生成复杂类型?

时间:2012-12-04 05:50:21

标签: asp.net-mvc razor html-helper

我有一个复杂类型的许可证作为视图模型。

public class License
{
    public string Name { get; set; }

    //  Other Properties

    public List<Function> Functions { get; set; }
}

public class Function
{
    public string Name { get; set; }

    //  Other Properties

    public List<Unit> Units { get; set; }
}

public class Unit
{
    public string Name { get; set; }

    //  Other Properties
}

动态呈现Function的视图模板和Unit的视图模板。所以html看起来像这样:

<!-- LicenseView -->
@model License

@Html.TextBoxFor(m => m.Name)  //  this is OK

@for(int i=0; i<Model.Functions.Count; i++)
{
    @Html.Partial(Model.Functions[i].Name, Model.Functions[i])
}

并且FunctionView可能看起来像这样

@model Function

@Html.TextBoxFor(m => m.Name)  //  the generated html element's name is just 'Name'

@for(int i=0; i < Model.Units.Count; i++)
{
    @Html.Partial(Model.Units[i].Name, Model.Units[i])
}

这是UnitView

@model Unit

@Html.TextBoxFor(m => m.Name)  // the generated html element's name is just 'Name'

所以我的问题是,我应该怎么做才能使Name属性正确?

非常感谢

4 个答案:

答案 0 :(得分:1)

您需要在上面的代码中进行的唯一更改是使用编辑器而不是部分视图。  因此,基本上所有代码都将类似于以下

@model License

@Html.TextBoxFor(m => m.Name) 
// Editor will take care of the repetition and u don't need to explicitly pass in the name
// Since the model already have the attribute
@Html.EditorFor(Model.Functions)

然后在“Shared”文件夹下创建编辑器模板文件夹“EditorTemplates”,并将您的视图文件命名为“Function”

为Unit类做同样的事情,你会得到你想要的。

答案 1 :(得分:0)

请原谅我对问题的猜测,但你是否要求DisplayName属性?

它将定义html助手如何显示你的字段标签

public class License
{
    [DisplayName("License Name")]
    public string Name { get; set; }

    //  Other Properties

    public List<Function> Functions { get; set; }
}

public class Function
{
    [DisplayName("Fun Name")]
    public string Name { get; set; }

    //  Other Properties

    public List<Unit> Units { get; set; }
}

public class Unit
{
    [DisplayName("Unit Name")]
    public string Name { get; set; }

    //  Other Properties
}

一定要

using System.ComponentModel;

在你的模型代码中。

答案 2 :(得分:0)

如果您希望能够为复杂对象图创建所有输入并让整个图形由模型绑定器重构,则最简单的方法是创建单个视图或部分视图来呈现整个图表:

@for(int i=0;i<Functions.Length;i++){
    @for(int j=0;j<Units.Length;j++){

        @Html.EditorFor(Functions[i].Length[j].Unit)

    }
}

另一种选择是找到一种方法将元素的索引传递给对象图上每个叶子的部分视图。

当然,很多人不喜欢在单个视图中渲染复杂模型的想法。但是,您的另一个选择是使单位等较小的子视图依赖于上下文注入或提供的其他数据。其中6个,另外6个。几乎每次我都完成了“学术上正确”的方法,只为对象图中的每种类型制作一个视图或部分视图,我最终得到了一大堆不可重复使用的视图和唯一的优势我得到的是能够说,“看!很多小文件.....完全依赖于彼此......为什么我这样做?”

答案 3 :(得分:0)

正如@Jack所说......你可以使用编辑器代替PartialViews来做到这一点。

但是......如果你真的想使用PartialViews,你可以做到,但要传递的模型应该是最重要的(许可证)。这种方式类似于David Jessee提出的方法,但将一个视图分成几个。