ASP.NET MVC Html助手

3

我试图创建一些Html Helpers,它们将具有开放标签和闭合标签,并包含其他内容,就像Html.BeginForm一样。 例如,在Razor中我们可以使用Html.BeginForm Helper,它的语法如下:

    @using (Html.BeginForm())
    {
    }

这段代码将包含花括号中的内容在<div> 和 </div> 之间。我解决了打开和关闭标签以及包含内容的唯一方法是使用两个html helper。我定义了两个html helper:

    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助手,使其在视图中具有以下格式:

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

有人能帮我解决这个问题吗?因为我甚至不知道该如何搜索它。


请看这里:https://dev59.com/U2sy5IYBdhLWcg3wvgdk以及这里:https://dev59.com/cVPTa4cB1Zd3GeqPjXak - Javi
这些文章解释了如何使用Html.BeginForm。我想创建自己的html助手,以像Html.BeginForm一样运行。我希望有一个Html助手,可以以某种方式获取我们在花括号之间添加的内容,以便我能够在处理后将其发送回去。 - pitaridis
你可以通过查看源代码这里来了解它的实现方式。但在这种情况下,我建议忘记使用助手并直接编写表单标签。 - Jasen
同 Jasen 一样认同,写出表单标签更简单、轻松。然而,如果你愿意,你可以实现一个类似 MvcForm 的类来完成。 - vbn
1个回答

7
您可以像实现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>
}

非常感谢您。这正是我想要的。 - pitaridis
我强烈建议使用TagBuilder而不是手动创建标签。自MVC 2以来,MVC一直在使用它来创建标签。 - Erik Philips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接