是否存在像@ Html.Label这样的MVC HtmlHelper生成<span>?

时间:2017-02-16 16:45:56

标签: asp.net-mvc razor

我想知道是否需要创建自定义HtmlHelper来简单地将值显示为跨度。

目前我正在使用:

@model string
@{
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
}
<span class="@htmlAttributes["class"]">@Model</string>

我只是想知道是否已经存在像@ Html.Label这样的东西,所以我能做到:

@model string
@Html.SomethingLikeSpan("", Model, @ViewData["htmlAttributes"])

2 个答案:

答案 0 :(得分:2)

尚未,但您可以使用您希望的任何标记组合扩展Helpers对象。

使用以下代码添加名为HtmlHelperExtensions.cs的类文件:

_$!<Home>!$_

然后在您的视图中,使用以下内容使用新的帮助程序扩展名格式化任何内容:

label

答案 1 :(得分:2)

我知道这篇文章已经很老了,但是我将发布过去用来完成@ Html.Span和@ Html.SpanFor帮助者的非常基本版本的内容。我将同时发布.netcore和MVC5。我希望这可以帮助人们!

MVC 5实施

using System;
using System.Linq.Expressions;
using System.Web.Mvc;

public static class HMTLHelperExtensions
{
    public static MvcHtmlString Span(this HtmlHelper Helper, string Name, string Content, object HtmlAttributes)
    {
        var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(HtmlAttributes);

        TagBuilder tag = new TagBuilder("Span");
        tag.MergeAttribute("name", TagBuilder.CreateSanitizedId(Name));
        tag.GenerateId(Name);
        tag.InnerHtml = Content;
        foreach(var i in htmlAttributes )
        {
            tag.MergeAttribute(i.Key, i.Value.ToString());
        }
        return MvcHtmlString.Create(tag.ToString());
    }

    public static MvcHtmlString Span(this HtmlHelper Helper, string Name, string Content)
    {
        TagBuilder tag = new TagBuilder("Span");
        tag.MergeAttribute("name", TagBuilder.CreateSanitizedId(Name));
        tag.GenerateId(Name);
        tag.InnerHtml = Content;
        return MvcHtmlString.Create(tag.ToString());
    }

    public static MvcHtmlString SpanFor<TModel, TProperty>(this HtmlHelper<TModel> Helper, Expression<Func<TModel, TProperty>> expression, string Content, object HtmlAttributes)
    {
        var name = ExpressionHelper.GetExpressionText(expression);
        var metaData = ModelMetadata.FromLambdaExpression(expression, Helper.ViewData);
        return Span(Helper, name, metaData.Model as string, HtmlAttributes);
    }

    public static MvcHtmlString SpanFor<TModel, TProperty>(this HtmlHelper<TModel> Helper, Expression<Func<TModel, TProperty>> expression, string Content)
    {
        var name = ExpressionHelper.GetExpressionText(expression);
        var metaData = ModelMetadata.FromLambdaExpression(expression, Helper.ViewData);
        return Span(Helper, name, metaData.Model as string);
    }
}

这是.netcore实现

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
using System;
using System.Linq.Expressions;

public static class HtmlHelperExtensions
{
    public static IHtmlContent Span(this IHtmlHelper htmlHelper, string name, string Content, object htmlAttributes)
    {
        TagBuilder tag = new TagBuilder("Span");
        tag.MergeAttribute("name", TagBuilder.CreateSanitizedId(name,""));
        tag.GenerateId(name, "");
        tag.InnerHtml.Append(Content);
        var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        foreach (var i in attributes)
        {
            tag.MergeAttribute(i.Key, i.Value.ToString());
        }
        return tag;
    }

    public static IHtmlContent Span(this IHtmlHelper htmlHelper, string name, string Content)
    {
        TagBuilder tag = new TagBuilder("Span");
        tag.MergeAttribute("name", TagBuilder.CreateSanitizedId(name, ""));
        tag.GenerateId(name, "");
        tag.InnerHtml.Append(Content);
        return tag;
    }

    public static IHtmlContent SpanFor<TModel, TProperty>(this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel,TProperty>> expression, string content, object htmlAttributes)
    {
        var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, htmlHelper.ViewData, htmlHelper.MetadataProvider);
        var name = ExpressionHelper.GetExpressionText(expression);
        var metaData = modelExplorer.Metadata;
        return Span(htmlHelper, name, modelExplorer.Model as string, htmlAttributes);
    }

    public static IHtmlContent SpanFor<TModel, TProperty>(this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string content)
    {
        var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, htmlHelper.ViewData, htmlHelper.MetadataProvider);
        var name = ExpressionHelper.GetExpressionText(expression);
        var metaData = modelExplorer.Metadata;
        return Span(htmlHelper, name, modelExplorer.Model as string);
    }
}

我想指出的是,只有以这种格式使用时,这些属性才可以使用html属性。

@Html.Span("Test", "Testing Content", new { @class = "test-class", style = "text-align:right" }
@Html.SpanFor(x=>x.ModelProperty, Model.ModelProperty, new { @class = "test-class", style = "text-align:right" }