asp.net-mvc - ASP.NET MVC Html 帮助程序

标签 asp.net-mvc extension-methods html-helper

我尝试创建一些 Html Helpers,它们将具有开始标记和结束标记,其中将包含其他内容,如 Html.BeginForm 那样。 例如,在 Razor 中,我们可以使用 Html.BeginForm 帮助器,其语法如下:

    @using (Html.BeginForm())
    {
    }

此代码将包含 a 和 内大括号的内容。我解决打开和关闭包含内容的标签的唯一方法是使用两个 html 助手。我定义了两个 html 助手:

    public static MvcHtmlString StartForm(this System.Web.Mvc.HtmlHelper helper)
    {
        return new MvcHtmlString("<form>");
    }
    public static MvcHtmlString EndForm(this System.Web.Mvc.HtmlHelper helper)
    {
        return new MvcHtmlString("</form>");
    }

然后我使用以下示例来使用帮助器:

    @Html.StartForm()
    contents
    @Html.EndForm()

但是我希望能够制作一个 html 助手,它在 View 中具有以下格式:

    @using (Html.MyForm())
    {
            <text>contents</text>
    }

有人可以帮我解决这个问题吗,因为我什至不知道如何搜索它。

最佳答案

您可以像 MvcForm 的实现方式一样定义一个类。下面的类允许您创建包含其他元素的标签。

public class MvcTag : IDisposable
{
    private string _tag;
    private bool _disposed;
    private readonly FormContext _originalFormContext;
    private readonly ViewContext _viewContext;
    private readonly TextWriter _writer;

    public MvcTag(ViewContext viewContext, string tag)
    {
        if (viewContext == null)
        {
            throw new ArgumentNullException("viewContext");
        }

        _viewContext = viewContext;
        _writer = viewContext.Writer;
        _originalFormContext = viewContext.FormContext;
        viewContext.FormContext = new FormContext();
        _tag = tag;
        Begin(); // opening the tag
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Begin()
    {
        _writer.Write("<" + _tag + ">");
    }

    private void End()
    {
        _writer.Write("</" + _tag + ">");
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            _disposed = true;
            End(); // Closing the tag

            if (_viewContext != null)
            {
                _viewContext.OutputClientValidation();
                _viewContext.FormContext = _originalFormContext;
            }
        }
    }

    public void EndForm()
    {
        Dispose(true);
    }
}

要以 MvcForm 的方式使用此 MvcTag,我们必须定义一个扩展

public static class HtmlHelperExtensions
{
    public static MvcTag BeginTag(this HtmlHelper htmlHelper, string tag)
    {
        return new MvcTag(htmlHelper.ViewContext, tag);
    }
}

就是这样。现在您可以将其用作:

@using(Html.BeginTag("div")) @* This creates a <div>, alternatively, you can create any tag with it ("span", "p" etc.) *@
{ 
    <p>Contents</p>
}

关于asp.net-mvc - ASP.NET MVC Html 帮助程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23173128/

相关文章:

c# - 如果有方法/扩展方法,则调用它

asp.net-mvc - 为什么我不能使用 Html.Helpers 在 ASP.NET MVC 表单中指定 `name` 属性?

asp.net-mvc - 找不到名为 'XX' 的 View 组件

asp.net-mvc - 如何将 ASP.NET MVC 用户控件构建到类库中

c# - 这个静态类会在多用户场景中中断吗?

c# - C# 扩展方法和 F# 管道转发运算符之间有什么关系?

asp.net-mvc - 在常规 ASP.NET MVC 项目中使用 Webmatrix 帮助程序

jquery - 在 HTML 帮助程序中使用 jQuery

asp.net-mvc - 禁用 HTML.TextBoxFor()

javascript - Angular2如何从MVC传递应用程序配置?