Cri*_*scu 9 asp.net asp.net-mvc razor
在Razor语法中使用此HTML帮助程序时:
@Html.EditorFor(model => model.Prop1)
Run Code Online (Sandbox Code Playgroud)
...约定是在下面呈现视图 Views/<CrtView|Shared>/EditorTemplates/Prop1TypeName.cshtml.
到现在为止还挺好.请注意,如果Prop1的(限定)类型是my.org.ns.TheType,TheType.cshtml则将呈现该文件.
但是,如果我有一个模型与.Prop1和.Prop2,和:
Prop1.GetType().FullName == "my.org.ns1.TheType";
Prop2.GetType().FullName == "my.org.ns2.TheType"; //same type name but different namespace
Run Code Online (Sandbox Code Playgroud)
我称之为剃刀:
@Html.EditorFor(model => model.Prop1)
@Html.EditorFor(model => model.Prop2)
Run Code Online (Sandbox Code Playgroud)
...我无法让它显示不同类型的不同视图.
有没有办法消除歧义?
也许我对.cshtml文件的命名约定了解不止?
您可以使用此重载来指定要使用的编辑器的名称.有了这个,你会说出你的EditorTemplates First.cshtml和Second.cshtml,那么在你看来,做到这一点.
@Html.EditorFor(model => model.Prop1, "First")
@Html.EditorFor(model => model.Prop2, "Second")
Run Code Online (Sandbox Code Playgroud)
但是,我建议避免在同一个项目中重复使用相同的类型名称,即使它们具有不同的名称空间.这将导致阅读代码的人感到困惑,甚至可能会让你感到困惑.这是一个比不知道使用什么模板的框架更大的问题.
检查ASP.NET MVC 源代码时(第164行):
// TODO: Make better string names for generic types
yield return fieldType.Name;
Run Code Online (Sandbox Code Playgroud)
似乎开发团队意识到这种简化的方法(fieldType.Name对于复杂类型)可能是潜在的模糊性.我希望他们能找到一种优雅的方式让我们以更灵活的方式选择模板.
在此期间,您可以简单地使用该[UIHint]属性,如下所示:
[UIHint("ns1.TheType")]
public TheType Prop1 { get; set; }
[UIHint("ns2.TheType")]
public TheType Prop2 { get; set; }
Run Code Online (Sandbox Code Playgroud)
更新(根据您的评论):
将[UIHint]只能在一个属性或字段使用,因此你不能用它来装饰你的类.
但是,您可以创建自己的属性,该属性派生自UIHintAttribute:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class, AllowMultiple = true)]
public class MyUIHintAttribute : UIHintAttribute
{
public MyUIHintAttribute(string templateName) : base(templateName)
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后装饰你的课程:
[MyUIHint("ns1.TheType")]
public class TheType
{
....
}
[MyUIHint("ns2.TheType")]
public class TheType
{
....
}
Run Code Online (Sandbox Code Playgroud)
您不一定必须使用约定。您可以拥有自己的模板名称。
像这样,
@Html.EditorFor(model => model.Prop1,"TheType_1")
@Html.EditorFor(model => model.Prop2,"TheType_2")
Run Code Online (Sandbox Code Playgroud)
其中“TheType_1”和“TheType_2”是不同类型的不同模板名称。这是可用的六种不同重载方法之一。
| 归档时间: |
|
| 查看次数: |
10898 次 |
| 最近记录: |