Frage

Ich habe zwei Knöpfe auf meinem MVC -Form:

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

Woher weiß ich aus meiner Controller -Aktion, welche gedrückt wurde?

War es hilfreich?

Lösung

Nennen Sie beide Einsenden -Schaltflächen gleich

<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />

Dann erhalten Sie in Ihrem Controller den Wert des Sendens. Nur die geklickte Schaltfläche übergibt den Wert.

public ActionResult Index(string submit)
{
    Response.Write(submit);
    return View();
}

Sie können diesen Wert natürlich beurteilen, um unterschiedliche Vorgänge mit einem Switch -Block auszuführen.

public ActionResult Index(string submit)
{
    switch (submit)
    {
        case "Save":
            // Do something
            break;
        case "Process":
            // Do something
            break;
        default:
            throw new Exception();
            break;
    }

    return View();
}

Andere Tipps

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

Und in Ihrer Controller -Aktion:

public ActionResult SomeAction(string submit)
{
    if (!string.IsNullOrEmpty(submit))
    {
        // Save was pressed
    }
    else
    {
        // Process was pressed
    }
}

Dies ist eine bessere Antwort, sodass wir sowohl Text als auch Wert für eine Schaltfläche haben können:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-the-same-form.aspx

</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>

und der Controller:

public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
    return RedirectToAction("Index", "Home");
...

Kurz gesagt, es ist eine Einsende -Schaltfläche, aber Sie wählen den Namen mit dem Namensattribut, das noch leistungsfähiger ist, da Sie nicht zum Namen Senden oder Schaltfläche in den Parametern der Controller -Methode verpflichtet sind. Sie können ihn so aufrufen, wie Sie mögen ...

Sie können Ihre Schaltfläche von dort aus dem Namensschild wie unten identifizieren. Sie müssen sich so in Ihrem Controller überprüfen

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}

Hier ist eine wirklich schöne und einfache Möglichkeit, es mit wirklich einfach zu befolgen Anweisungen mit einem benutzerdefinierten MultibuttonAttribute:

http://blog.maartenballiauw.be/post/2009/11/26/supporting-multiple-submit-buttons-on-an-aspnet-mvc-view.aspx

Zusammenfassend lassen Sie sich Ihre Einsendetasten wie folgt vorstellen:

<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" /> 

Ihre Handlungen wie diese:

[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
    return Content("Cancel clicked");
}

[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
    return Content("Create clicked");
} 

Und erstellen Sie diese Klasse:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
    public string MatchFormKey { get; set; }
    public string MatchFormValue { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[MatchFormKey] != null &&
            controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
    }
}
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
    string submitType = "unknown";

    if(collection["submit"] != null)
    {
        submitType = "submit";
    }
    else if (collection["process"] != null)
    {
        submitType = "process";
    }

} // End of the index method

Um es einfacher zu machen, werde ich sagen, dass Sie Ihre Schaltflächen in Folgendes ändern können:

<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />

Ihr Controller:

public ActionResult Create(string btnSubmit, string btnProcess)
{
    if(btnSubmit != null)
       // do something for the Button btnSubmit
    else 
       // do something for the Button btnProcess
}

Dieser Beitrag wird Coppermill nicht antworten, weil er vor langer Zeit beantwortet wurde. Mein Beitrag wird hilfreich sein, um nach einer solchen Lösung zu suchen. Zunächst muss ich sagen "Wduffys Lösung ist völlig korrekt" und es funktioniert einwandfrei, aber meine Lösung (nicht wirklich meins) wird in anderen Elementen verwendet und macht die Präsentationsschicht unabhängiger von Controller (weil Ihr Controller von von Ihrem Controller abhängt "Wert", das zum Anzeigen der Etikett der Schaltfläche verwendet wird, ist diese Funktion für andere Sprachen wichtig.).

Hier ist meine Lösung, geben Sie ihnen unterschiedliche Namen:

<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>

Und Sie müssen die Namen von Schaltflächen als Argumente in der Aktion wie unten angeben:

public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
    if (buttonSave!= null)
    {
        //save is pressed
    }
    if (buttonProcess!= null)
    {
        //Process is pressed
    }
    if (buttonCancel!= null)
    {
        //Cancel is pressed
    }
}

Wenn der Benutzer die Seite mit einer der Schaltflächen einreicht, hat nur eines der Argumente einen Wert. Ich denke, das wird für andere hilfreich sein.

Aktualisieren

Diese Antwort ist ziemlich alt und ich habe meine Meinung tatsächlich überdenken. Vielleicht ist die obere Lösung gut für Situationen, die den Parameter an die Eigenschaften des Modells übergeben. Stören Sie sich nicht und nehmen Sie die beste Lösung für Ihr Projekt.

Geben Sie den beiden Schaltflächen den Namen an und prüfen Sie den Wert aus dem Formular.

<div>
   <input name="submitButton" type="submit" value="Register" />
</div>

<div>
   <input name="cancelButton" type="submit" value="Cancel" />
</div>

Auf der Controller -Seite:

public ActionResult Save(FormCollection form)
{
 if (this.httpContext.Request.Form["cancelButton"] !=null)
 {
   // return to the action;
 }

else if(this.httpContext.Request.Form["submitButton"] !=null)
 {
   // save the oprtation and retrun to the action;
 }
}

In Core 2.2 Rasierseiten funktioniert diese Syntax:

    <button type="submit" name="Submit">Save</button>
    <button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
        return Page();
    var sub = Request.Form["Submit"];
    var can = Request.Form["Cancel"];
    if (sub.Count > 0)
       {
       .......

Können Sie nicht die Verwendung von Request.Form -Sammlung herausfinden? Wenn der Prozess auf die Anforderung geklickt wird. Form ["Prozess"] ist nicht leer

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top