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



我有一个复杂类型的License作为视图模型。

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])
}

功能视图可能看起来像这个

@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属性正确?

非常感谢

在上面的代码中需要做的唯一更改是使用Editor而不是局部视图。所以基本上你所有的代码看起来都类似于下面的

@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">

对单元课也这样做,你就会得到你想要的。

正如@Jack所说。。。可以使用编辑器而不是PartialViews来执行此操作。

但是。。。如果你真的想使用PartialViews,你可以这样做,但要通过的模型应该是顶级的(License)。这种方式类似于David Jessee的提议,但将一种观点一分为二。

请原谅我对这个问题的猜测,但你是在问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;

在您的模型代码中。

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

@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个,另一个6打。几乎每次我用"学术上正确"的方法为对象图中的每种类型制作一个视图或部分视图时,我都会得到一大堆一开始就不可重复使用的视图,我得到的唯一优势是能够说:"看!很多小文件……它们完全相互依赖……我为什么这么做?">

相关内容

  • 没有找到相关文章

最新更新