只需阅读此网址What is use of UIHint attribute in MVC
中的UIHint如果使用UIHint属性注释属性 并在您的视图中使用EditorFor或DisplayFor, ASP.NET MVC框架将寻找指定的 您通过UIHintAttribute指定的模板。 它寻找的目录是:
~/Views/Shared/EditorTemplates
~/Views/Controller_Name/EditorTemplates
~/Views/Shared/DisplayTemplates
~/Views/Controller_Name/DisplayTemplates
以上写的意思是MVC引擎首先在共享搜索视图中找不到然后它会在〜/ Views / Controller_Name / DisplayTemplates中搜索视图吗?
我刚买了一个代码,但它没有完整,所以无法正确理解
public class Person {
[UIHint("Poo")]
public string Name { get; set; }
}
@model MyApp.Models.Person
<h2>My Person</h2>
@Html.DisplayFor(m => m.Name)
如果我认为Poo是一个共享视图那么poo相关的视图代码在哪里?
当此行执行@Html.DisplayFor(m => m.Name)
时会发生什么。
请参阅此代码
@Html.EditorFor(model => model.ProductViewModel, "yourTemplateName")
哪里MVC会找到你的文件yourTemplateName.cshtml?
感谢
答案 0 :(得分:5)
以上写的意思是MVC引擎首先在共享搜索视图中找不到然后它会在〜/ Views / Controller_Name / DisplayTemplates中搜索视图吗?
这是倒退,搜索模式是(确切地):
(如果在一个地区)
"~/Areas/{2}/Views/{1}/DisplayTemplates/{0}.cshtml",
"~/Areas/{2}/Views/{1}/DisplayTemplates/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/DisplayTemplates/{0}.cshtml",
"~/Areas/{2}/Views/Shared/DisplayTemplates/{0}.vbhtml"
然后
"~/Views/{1}/DisplayTemplates/{0}.cshtml",
"~/Views/{1}/DisplayTemplates/{0}.vbhtml",
"~/Views/Shared/DisplayTemplates/{0}.cshtml",
"~/Views/Shared/DisplayTemplates/{0}.vbhtml"
其中
0 = Template/Type name
1 = ControllerName
2 = AreaName
(如果您没有提供模板名称提示,则剃刀引擎默认为类型(int,boolean,string甚至是您定义的自定义类类型)
如果我认为Poo是一个共享视图那么poo相关的视图代码在哪里?
在上面的另外一个地方。这允许您为每个控制器和/或共享poo
视图创建poo
个特定视图。但是你想要这样做。
当这一行执行@ Html.DisplayFor(m =&gt; m.Name)时会发生什么。
引擎将在上面的文件夹中搜索模板。如果找不到,则会在相同的文件夹中查找object.cshtml/vbhtml
。如果找到该文件,则执行该文件,否则执行代码的默认内部object
显示。
哪里MVC会找到你的文件yourTemplateName.cshtml?
在上面的相同目录中。你必须要理解这一点,它一遍又一遍地做同样的事情,它是convention的asp.net-mvc。
ASP.Net MVC中UIHint属性的用途是什么
这允许您覆盖用于给定属性的模板。
public class Person
{
[UIHint("Age")]
public DateTime Birthday { get; set; }
}
将尝试寻找&#39; age.cshtml&#39;在上述地点。由于UIHintAttribute
未被密封,您还可以派生自己的属性并创建一些非常漂亮的模板:
public UIDateTimeAttribute : UIHintAttribute
{
public UIDateTimeAttribute(bool canShowSeconds)
: base("UIDateTime", "MVC")
{
CanShowSeconds = canShowSeconds;
}
public bool CanShowSeconds { get; private set; }
}
然后您的模型可能如下:
public class Person
{
[UIDateTime(false)]
public DateTime Birthday { get; set; }
}
UIDateTime.cshtml
@model DateTime
@{
var format = "dd-MM-yy hh:mm:ss";
// Get the container model (Person for example)
var attribute = ViewData.ModelMetadata.ContainerType
// Get the property we are displaying for (Birthday)
.GetProperty(ViewData.ModelMetadata.PropertyName)
// Get all attributes of type UIDateTimeAttribute
.GetCustomAttributes(typeof(UIDateTimeAttribute))
// Cast the result as UIDateTimeAttribute
.Select(a => a as UIDateTimeAttribute)
// Get the first one or null
.FirstOrDefault(a => a != null);
if (attribute != null && !attribute.CanShowTime)
{
format = "dd-MM-yy hh:mm";
}
}
@Model.ToString(format)