c# - Asp MVC 4 创建类似于 Html.BeginForm 的自定义 html 帮助器方法

标签 c# asp.net-mvc-3 asp.net-mvc-4

我有以下 html:

<div data-bind="stopBindings">

    <div data-viewId="languageList" data-bind="with: viewModel">
       <table>
              <tr>
                   <td ><label for="availableLanguages">Available Languages:</label></td>
              </tr>
       <table>
    </div>

</div>

我想制作一个自定义的 html 助手并像这样使用它(类似于 Html.BeginForm)

@Html.BeginView()
{
    <table>
        <tr>
            <td ><label for="availableLanguages">Available Languages:</label></td>
        </tr>
    </table>
}

我开始制作我的辅助方法

public static class BeginViewHelper
    {
        public static MvcHtmlString BeginView(this HtmlHelper helper, string viewId)
        {

            var parentDiv = new TagBuilder("div");
            parentDiv.MergeAttribute("data-bind", "preventBinding: true");
            return new MvcHtmlString();
        }

    }

我阅读了如何制作基本的 html 帮助程序,但我看到的示例并未提供有关如何制作它的信息。我是 asp mvc 的新手,非常感谢您的帮助。

更新 2:

显然我遗漏了一些东西。在我看来,我这样称呼:

@Html.BeginView()
{
    <table>
        <tr>
            <td ><label >test</label></td>
        </tr>
    </table>
}

一切似乎都很好,甚至还有智能感知。但是浏览器中的输出如下:

Omega.UI.WebMvc.Helpers.BeginViewHelper+MyView { 


test

 } 

这是我的辅助方法:

namespace Omega.UI.WebMvc.Helpers
{
    public static class BeginViewHelper
    {
        public static IDisposable BeginView(this HtmlHelper helper)
        {
            helper.ViewContext.Writer.Write("<div data-bind=\"preventBinding: true\">");
            helper.ViewContext.Writer.Write("<div data-viewId=\"test\">");

            return new MyView(helper);
        }

        class MyView : IDisposable
        {
            private HtmlHelper _helper;

            public MyView(HtmlHelper helper)
            {
                this._helper = helper;
            }

            public void Dispose()
            {
                this._helper.ViewContext.Writer.Write("</div>");
                this._helper.ViewContext.Writer.Write("</div>");
            }
        }
    }
}

我已经在 ~/Views/web.config 中注册了命名空间

 <add namespace="Omega.UI.WebMvc.Helpers" />

最佳答案

您不能返回 MvcHtmlString。相反,您应该将 html 写入编写器并返回实现 IDisposable 的类,并且在调用 Dispose 期间将写入 HTML 的结束部分。

public static class BeginViewHelper
{
    public static IDisposable BeginView(this HtmlHelper helper, string viewId)
    {
        helper.ViewContext.Writer.Write(string.Format("<div id='{0}'>", viewId));

        return new MyView(helper);
    }

    class MyView : IDisposable
    {
        private HtmlHelper helper;

        public MyView(HtmlHelper helper)
        {
            this.helper = helper;
        }

        public void Dispose()
        {
            this.helper.ViewContext.Writer.Write("</div>");
        }
    }
}

如果您有更复杂的结构,您可以尝试使用 TagBuilder:

TagBuilder tb = new TagBuilder("div");
helper.ViewContext.Writer.Write(tb.ToString(TagRenderMode.StartTag));

关于c# - Asp MVC 4 创建类似于 Html.BeginForm 的自定义 html 帮助器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14236017/

相关文章:

c# - C#记录麦克风输入并将其存储在字节数组中,而不是本地存储中

asp.net-mvc-3 - 很难获取有关在 Orchard View 中工作的权限的条件代码

c# - 如何强制 MVC4 中的 WebAPI 在 json 结果中将空字符串呈现为空

asp.net - 在asp.net MVC中不使用LabelFor Helper获取DisplayName属性

.net - 是否可以覆盖 .NET 子类中的 DataAnnotation 属性?

dependencies - 我可以将 ravendb 客户端与 Microsoft.AspNet.WebApi.Client 一起安装吗?

c# - 期望在测试中出现异常但想要验证是否调用了 dispose

c# - 连接字符串中缺少 MultipleActiveResultSets 导致错误

c# - 创建和删除文件夹时 MVC session 丢失

asp.net-mvc-3 - MVC 无法在 ActionMethod 中找到 View