2 Stimmen

Mehrere 'GET'-Formulare in ASP.NET MVC 3

Ich habe die folgende HTMLHelper-Erweiterung, um einen Submit-Button zu erstellen, der mit ausgeschaltetem JavaSceript funktionieren würde:

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

Das Problem ist, dass es gut funktioniert, wenn es nur eine dieser Schaltflächen auf einer Seite gibt, aber wenn es mehr als 1 gibt, fangen seltsame Dinge an zu passieren. Zum Beispiel, wenn ich die folgende Erklärung in einer Schleife haben:

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

Es wird folgendes HTML generiert, das für mich gut aussieht:

<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>

Wenn es mehr als 1 Formular gibt, wird der Querystring beim Absenden des Formulars ignoriert. Ich habe andere seltsame Verhalten, wenn mehr als eine dieser Tasten auf einem Formular ist.

Meine Frage ist, ob dieses Verhalten für mehrere "get"-Formulare zu erwarten ist?

Gibt es eine bessere Möglichkeit, eine Schaltfläche zu erstellen, die funktioniert, wenn JavaScript deaktiviert ist, und die so navigiert, wie ich es erreichen möchte?

1voto

Guffa Punkte 663241

Wenn Sie die GET-Methode im Formular verwenden, besteht der Querystring aus den Daten der Felder im Formular. Das ersetzt den Querystring, den Sie in die URL eingegeben haben, und das sollte unabhängig davon geschehen, ob es ein einzelnes Formular oder mehrere Formulare auf der Seite gibt.

Setzen Sie den Wert in ein verstecktes Feld im Formular statt in die URL. Beispiel:

<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>

Eine andere Möglichkeit, das gleiche Ergebnis zu erzielen, wäre die Verwendung eines Links:

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

0voto

Luke Bennett Punkte 32186

Hier ist eine weitere Möglichkeit - Sie könnten alle Übermittlungsschaltflächen in einem einzigen Formular unterbringen und Ihrer Übermittlungsschaltfläche einen Namen wie den folgenden geben:

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

Nur die Submit-Schaltfläche, die ein Benutzer drückt, wird mit dem Formularbeitrag übermittelt, so dass alles, was Sie serverseitig tun müssen, eine Schleife durch die Querystring-Parameter ist und denjenigen mit dem Präfix submit_ um herauszufinden, welche Taste gedrückt wurde.

0voto

DiSaSteR Punkte 548
<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>

dann die Post-Methode

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

der Parameter buttonAction enthält den Wert der Schaltfläche, so dass Sie jetzt die gewünschte Schaltfläche auswählen und ausführen können:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X