0

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

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

4 回答 4

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 类做同样的事情,你会得到你想要的。

于 2012-12-04T12:19:15.787 回答
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;

在您的模型代码中。

于 2012-12-04T05:56:50.200 回答
0

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

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

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

    }
}

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

诚然,很多人不喜欢在单个视图中渲染复杂模型的想法。但是,您的另一个选择是使 Units 等的较小子视图依赖于注入或由上下文提供的附加数据。6个一个,半打另一个。几乎每次我完成“学术上正确”的方法,即为对象图中的每种类型制作一个视图或部分视图时,我最终都会得到一大堆视图,这些视图一开始是不可重用的,也是唯一的优势我有能力说,“看!很多小文件……完全相互依赖……我为什么要这样做?”

于 2012-12-04T11:57:30.137 回答
0

正如@Jack 所说......您可以使用编辑器而不是 PartialViews 来做到这一点。

但是......如果你真的想使用PartialViews,你可以这样做,但要传递的模型应该是最重要的(License)。这种方式与 David Jessee 提出的类似,但将一个视图拆分为多个视图。

于 2012-12-04T12:35:14.640 回答