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