2011-02-14 90 views
2

我有以下的HtmlHelper擴展來創建一個提交按鈕,將與JavaSceript工作關閉:多個「GET」在ASP.NET MVC的形式3

public static string ActionButton(this HtmlHelper helper, string value, 
         string action, string controller, object routeValues = null, object htmlAttributes = null) 
{ 
    var a = (new UrlHelper(helper.ViewContext.RequestContext)) 
          .Action(action, controller, routeValues); 

    var form = new TagBuilder("form"); 
    form.Attributes.Add("method", "get"); 
    form.Attributes.Add("action", a); 
    form.Attributes.Add("style", "display:inline"); 

    var input = new TagBuilder("input"); 
    input.Attributes.Add("type", "submit"); 
    input.Attributes.Add("value", value); 
    input.Attributes.Add("class", "button"); 
    input.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

    form.InnerHtml = input.ToString(TagRenderMode.SelfClosing); 

    return form.ToString(TagRenderMode.Normal); 
} 

的問題是,它工作正常,如果有隻是頁面上的這些按鈕中的一個,但如果超過1個,奇怪的事情就開始發生。舉例來說,如果我有一個循環以下聲明:

<td class="tac"><%=Html.ActionButton("Choose", "CreateNewAuditFromExisting", "Audit", new { auditUid = audit.Uid })%></td> 

下面的HTML被產生的,對我來說很好:

<tr> 
    <td class="tac"> 
     <form action="/admin/Audit.mvc.aspx/CreateNewAuditFromExisting?auditUid=906e26e5-6505-4a70-b19a-9e8a00d74a88" method="get"style="display:inline"> 
      <input class="button" type="submit" value="Choose"> 
     </form> 
    </td> 
</tr> 

<tr> 
    <td class="tac"> 
     <form action="/admin/Audit.mvc.aspx/CreateNewAuditFromExisting?auditUid=899eb11d-54a8-448f-9539-9e8a00d7c652" method="get" style="display:inline"> 
     <input class="button" type="submit" value="Choose"> 
     </form> 
    </td> 
</tr> 

當有超過1點的形式,查詢字符串變提交表單時忽略。當這些按鈕中的多個按鈕位於窗體上時,我還有其他奇怪的行爲。

我的問題是,這種行爲是多個'get'形式的預期?

此外,有沒有更好的方法來創建一個按鈕,將JavaScript的功能禁用時,將導航像我想要實現的?

+1

我的猜測是,你想要按鈕,因爲它的風格...在這種情況下,你可能想要使它成爲一個普通的鏈接,並將其設計得像一個按鈕。 – Gidon 2011-02-14 14:05:37

+0

@ R0MANARMY:第一種形式也有一個按鈕。出於某種原因,它與表單標籤位於同一行。 – Guffa 2011-02-14 14:59:12

回答

1

當您在表單中使用GET方法時,查詢字符串將是表單中字段的數據。這將替換您在URL中放置的查詢字符串,並且無論頁面中是否有單個窗體或多個窗體,都會發生這種情況。

將值放在表單中的隱藏字段中而不是URL中。例如:

<form action="/admin/Audit.mvc.aspx/CreateNewAuditFromExisting" method="get" style="display:inline"> 
    <input type="hidden" name="auditUid" value="899eb11d-54a8-448f-9539-9e8a00d7c652"> 
    <input class="button" type="submit" value="Choose"> 
</form> 

另一種方式來獲得相同的結果將是簡單地用一個鏈接:

<a href="/admin/Audit.mvc.aspx/CreateNewAuditFromExisting?auditUid=906e26e5-6505-4a70-b19a-9e8a00d74a88">Choose</a> 
0

這裏的另一種可能性 - 你可以把所有的提交按鈕的單個表單中,給您的提交按鈕類似以下的名字:

<input class="button" type="submit" name="submit_899eb11d-54a8-448f-9539-9e8a00d7c652" value="Choose" /> 

只有提交用戶按下與表單提交按鈕提交,因此,所有你需要做的服務器端是通過查詢字符串環參數,並找出以submit_爲前綴的那個,找出哪一個被按下。

0
<button name="buttonAction" type="submit" class="btn btn-success" value=1>@Buttons.AddEntry</button> 
<button name="buttonAction" type="submit" class="btn btn-primary" value=2>@Messages.FillExistingEntry</button> 

然後POST方法

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult yourActionName(string buttonAction, yourViewModel model) 

的buttonAction PARAM包含該按鈕的值,所以現在你可以選擇你想要的和做的事:

return View("../YourController/YourAction", model);