【问题标题】:What is use of UIHint attribute in ASP.Net MVCASP.Net MVC 中 UIHint 属性的用途
【发布时间】:2015-10-11 15:34:32
【问题描述】:

刚刚从这个 url What is use of UIHint attribute in MVC 阅读关于 UIHint 的信息

如果您使用 UIHint 属性注释属性 并在您的视图中使用 EditorFor 或 DisplayFor, ASP.NET MVC 框架将寻找指定的 您通过 UIHintAttribute 指定的模板。 它寻找的目录是:

对于 EditorFor:

~/Views/Shared/EditorTemplates

~/Views/Controller_Name/EditorTemplates

对于 DisplayFor:

~/Views/Shared/DisplayTemplates

~/Views/Controller_Name/DisplayTemplates

上面写的意思是 MVC 引擎首先在 shared 中搜索视图,如果没有找到,它会在 ~/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)

如果我认为便便是共享视图,那么便便相关的视图代码在哪里?

当这一行将执行@Html.DisplayFor(m =&gt; m.Name) 时会发生什么。

查看此代码

@Html.EditorFor(model => model.ProductViewModel, "yourTemplateName")

MVC 将在哪里找到 yourTemplateName.cshtml 文件?

谢谢

【问题讨论】:

    标签: asp.net-mvc razor display-templates


    【解决方案1】:

    上面写的意思是 MVC 引擎首先在 shared 中搜索视图,如果没有找到,它会在 ~/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
    

    (如果您不提供模板名称​​hint,剃刀引擎默认为类型(int、boolean、string 甚至您定义的自定义类类型)

    如果我认为便便是共享视图,那么便便相关的视图代码在哪里?

    在上述多个地点。这允许您为每个控制器创建poo 特定视图和/或共享poo 视图。随心所欲。

    当这一行将执行@Html.DisplayFor(m => m.Name) 那么会发生什么。

    引擎将在上述文件夹中搜索模板。如果没有找到它,它会在相同的文件夹中查找object.cshtml/vbhtml。如果找到该文件,则执行该文件,否则执行默认的内部 object 代码显示。

    MVC 将在哪里找到 yourTemplateName.cshtml 文件?

    在上面的相同目录中。你必须明白它一遍又一遍地做同样的事情,它是convention

    在 ASP.Net MVC 中 UIHint 属性有什么用

    这允许您覆盖用于给定属性的模板。

    public class Person
    {
      [UIHint("Age")]
      public DateTime Birthday { get; set; }
    }
    

    将尝试在上述位置查找“age.cshtml”。由于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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 2023-03-11
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多