0

在 ASP.NET MVC 3 中,我们总是使用using(@html.BeginForm(){ }帮助器(假设使用不带任何参数)来使用带有回发的表单。

返回的 html 包含一个form带有一些属性的打开标记,这些属性action代表回发 url。

所以当我覆盖我的自定义BeginForm助手时,我需要这个 Url。此action属性不仅仅是动作名称或{area}/{controller}/{action}.

我认为这是我们用来查看当前页面的相同 url,因为当我们提交页面时,我们支持相同的操作或具有[HttpPost]属性的相同操作名称。

那么我怎样才能得到这个值HtmlHelper呢?

4

3 回答 3

3

您可以使用 ILSpy 或任何其他反射器并查看 Html.BeginForm 中发生的情况

我只是为你复制粘贴代码。

// System.Web.Mvc.Html.FormExtensions
/// <summary>Writes an opening &lt;form&gt; tag to the response. When the user submits the form, the request will be processed by an action method.</summary>
/// <returns>An opening &lt;form&gt; tag. </returns>
/// <param name="htmlHelper">The HTML helper instance that this method extends.</param>
public static MvcForm BeginForm(this HtmlHelper htmlHelper)
{
    string rawUrl = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
    return htmlHelper.FormHelper(rawUrl, FormMethod.Post, new RouteValueDictionary());
}


// System.Web.Mvc.Html.FormExtensions
private static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
    TagBuilder tagBuilder = new TagBuilder("form");
    tagBuilder.MergeAttributes<string, object>(htmlAttributes);
    tagBuilder.MergeAttribute("action", formAction);
    tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
    bool flag = htmlHelper.ViewContext.ClientValidationEnabled && !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;
    if (flag)
    {
        tagBuilder.GenerateId(htmlHelper.ViewContext.FormIdGenerator());
    }
    htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
    MvcForm result = new MvcForm(htmlHelper.ViewContext);
    if (flag)
    {
        htmlHelper.ViewContext.FormContext.FormId = tagBuilder.Attributes["id"];
    }
    return result;
}
于 2012-04-09T10:48:08.543 回答
0

如果您想要来自 @Html.BeginForm() 的操作属性而不需要任何参数,您可以使用 jquery。我用它来在 jqueryUI 对话框中 ajax 发布一个表单。

var form = $('form'); //get the form
var actionUrl = $('form').attr('action'); //get the action url

然后你可以使用 POST

 $.ajax({
      type: "POST",
      url: actionUrl,
      data: form.serialize(),                                    
      success: function (data, status, xhr) {
                if (data.Sucess) {
                   //do something
               } else {
               }
      }
})  

问候。

于 2012-04-09T11:18:42.137 回答
-1

使用 htmlhelper 参数

public class myBeginForm : IDisposable
{
    private HtmlHelper _myHtmlhelper;
    public myBeginForm (HtmlHelper htmlHelper, [you can add your need argument here] )
    {
        _myHtmlhelper= htmlHelper;
        var container = new TagBuilder("form");

       /// your Code 
    }

    public void Dispose()
    {
        myHtmlhelper.ViewContext.Writer.Write("</form>");
    }
}
于 2012-04-09T07:02:48.560 回答