2011-02-14 86 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);