MVC6替代@ Html.DisplayFor

Ser*_*rov 20 razor asp.net-core-mvc

MVC6引入了Tag Helpers,与使用@ Html.EditorFor等相比,这是更好的方法.但是我还没有发现任何Tag Helper可以替代@ Html.DisplayFor.

当然,我可以直接在Razor页面上使用变量,例如@ Model.BookingCode.但这不允许控制格式.

使用MVC6,显示模型属性值的概念正确方法是什么?

Joe*_*tte 13

@ Html.DisplayFor仍然存在,仍然可以使用.

HtmlHelpers和TagHelpers之间的区别在于HtmlHelpers选择为您呈现哪些html元素,而TagHelpers使用您自己添加的html标记,以便您可以更全面地控制使用的html元素.您可以使用HtmlHelpers模板对标记进行一些控制,但您可以使用TagHelper进行更多控制.

所以你应该考虑我想要包装这个模型属性的html标记,并使用@ Model.Property在其周围添加一些标记,或者如果你更愿意让帮助者决定,继续使用DisplayFor.

  • 我可以,而且有效.问题是,虽然MVC6为我们提供了更好,更直观的Html.EditorFor替代方案,但认为它也能为Html.DisplayFor提供更好的替代方案是合乎逻辑的.我可能只是错过了一个. (8认同)
  • @SergeyKandaurov,我完全同意你的看法.我觉得我们没有DisplayFor的taghelper是没有意义的.将<label asp-for ="Title">与@ Html.DisplayFor(model => model.Title)相结合似乎很荒谬. (5认同)
  • 我仍然认为MVC6缺少一种显示属性的格式化值的好方法,而我可以控制html标签.但这并不重要,因为DisplayFor仍然有效.无论如何,答案非常明确 - 没有TagHelper只显示值.谢谢! (3认同)
  • 它确实有意义,因为标签只是一个标签,DisplayFor可以输出任何东西.IMO (3认同)
  • 是的,TagHelpers在更复杂的事情上更有意义.然而,仅仅显示它可能是<span>或<div>,这对我来说非常有意义.甚至是像<value>这样的非HTML的东西.这样Razor代码可以更清晰,没有lambda表达式等. (2认同)

WeH*_*ies 8

您可以创建自己的标记助手

namespace MyDemo.TagHelpers
{
    [HtmlTargetElement("p", Attributes = ForAttributeName)]
    public class DisplayForTagHelper : TagHelper
    {
        private const string ForAttributeName = "asp-for";

        [HtmlAttributeName(ForAttributeName)]
        public ModelExpression For { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            var text = For.ModelExplorer.GetSimpleDisplayText();

            output.Content.SetContent(text);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加在视图中使用它:

<p asp-for="MyProperty" class="form-control-static"></p>
Run Code Online (Sandbox Code Playgroud)