2012-04-09 16 views
0

ASP.NET MVC 3では、常にusing(@html.BeginForm(){ }ヘルパーを使用しています(パラメータなしで使用すると仮定します)。BeginForm()でhtmlhelperを使用する方法ASP.NET MVC 3のメソッド

返されるHTMLには、一部の属性を持つformタグと、ポストバックURLを表すactionというタグが含まれています。

私がカスタムBeginFormヘルパーを上書きするとき、私はこのURLが必要です。このactionの属性は、単にアクション名ではなく、{area}/{controller}/{action}の組み合わせではありません。

私たちがページを提出するときに、同じアクションまたは同じアクション名に[HttpPost]属性を使用してバックアップしたので、これは現在のページを見るために使用する同じURLだと思います。

この値はHtmlHelperからどのように取得できますか?あなたはILSpyや他のリフレクタを使用して、私はちょうどあなたのためのコードをコピー&ペーストHtml.BeginForm

で何が起こっているのか見ることができます

+0

ちょうど好奇心から、あなたは何のためのカスタムBeginFormが必要ですか? – ngm

答えて

-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>"); 
    } 
} 
+0

私は質問に言及したが、引数を追加したくない、 'htmlhelper'から値を取得する必要がある、' BeginForm() 'を参照すると、それを得る方法があると確信している – Saeid

3

// 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; 
} 
+1

良い答えのようです。おそらくそれをそのようにマークするべきです。 – Roman

0

@ Html.BeginForm()のアクション属性をパラメータなしで使用する場合は、jqueryを使用できます。これをajaxに使用して、jqueryUIダイアログ内にフォームを投稿します。

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 { 
       } 
     } 
}) 

よろしくを使用することができます。

関連する問題