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 に答える