使用razor修改ASP.NET MVC3中的Html Helpers

时间:2012-08-07 13:54:54

标签: c# asp.net-mvc-3 razor html-helper

我有以下问题:

我想知道是否可以修改默认的html辅助方法,例如Html.BeginForm()方法。

我知道我可以编写一个自定义辅助方法,我可以添加一些东西,但其中一些有很多重载函数。

然后我唯一需要的是,你可以在“渲染元素之后”添加一些自定义html字符串

e.g:

@using(Html.BeginForm("setDate", "DateController", new { DateId = Model.Date.Identifier }, FormMethod.Post, new { id = "setDateForm" })) {
    @* some input here... *@
}

之后

<form></form>

我想渲染验证脚本,或其他东西,让我们说jQuery验证器:

<script>$('#setDateForm').validate();</script>

因为我不想一遍又一遍地这样做(也许我可以忘记它一次......)修改默认的Html助手会很好。

如果不可能,我可能不得不为EndForm帮助器编写自己的BeginForm或包装器:/

3 个答案:

答案 0 :(得分:2)

作为一个非常基本的起点,你可以使用这样的东西:

namespace YourProject.Helpers
{
    public static class HtmlHelperExtensions
    {
        public static IDisposable CustomBeginForm(this HtmlHelper helper, string html)
        {
            return new MvcFormExtension(helper, html);
        }

        private class MvcFormExtension : IDisposable
        {
            private HtmlHelper helper;
            private MvcForm form;
            private string html;

            public MvcFormExtension(HtmlHelper helper, string html)
            {
                this.helper = helper;
                this.form = this.helper.BeginForm();
                this.html = html;
            }

            public void Dispose()
            {
                form.EndForm();
                helper.ViewContext.Writer.Write(this.html);
            }
        }
    }
}

您需要在视图中添加命名空间或将其添加到Views文件夹中的web.config文件中。之后,您可以这样使用它:

@using (Html.CustomBeginForm("<p>test</p>")) {
    // Additional markup here
}

这对我有用,但您肯定需要根据自己的需要对其进行自定义,尤其是您可能希望将其他参数传递给Html.BeginForm()

答案 1 :(得分:1)

您可以编写自己的Extension方法来执行此操作。从Codeplex获取BeginForm方法的代码。(MVC3源代码是open source :))并对其进行相关更新以呈现您想要的表单。

代码位于FormExtensions.cs项目下的System.Web.MVC课程中。查找从BeginForm Overrides调用的FormHelper方法。

答案 2 :(得分:0)

这是不可能的。你必须自己做帮助。