Domanda

Ho due pulsanti sulla mia forma MVC:

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

Dalla mia azione di controllo come faccio a sapere quale sono stati premuti?

È stato utile?

Soluzione

Nome entrambi i pulsanti presentare la stessa

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

Poi nel controller ottenere il valore di presentare. il pulsante cliccato Solo passerà il suo valore.

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

Ovviamente si può valutare che il valore per eseguire diverse operazioni con un blocco switch.

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

    return View();
}

Altri suggerimenti

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

E nella vostra azione di controllo:

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

Questa è una risposta migliore, in modo che possiamo avere sia il testo e il valore per un pulsante:

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

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

e il controller:

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

In breve il suo un pulsante di invio, ma si sceglie il nome con l'attributo name, la sua ancora più potente perché il tuo non obbligato a nome presentare o pulsante i parametri del metodo di controllo, si può chiamare come volete ...

è possibile identificare il pulsante da lì targhetta con il nome come qui di seguito, È necessario controllare come questo in voi controllo

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

Ecco un modo davvero piacevole e semplice di farlo con molto facile seguire le istruzioni utilizzando un MultiButtonAttribute personalizzato:

http: / /blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

In sintesi, rendere la vostra presentare pulsanti in questo modo:

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

Le vostre azioni come questo:

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

E creare questa classe:

[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

Per rendere più facile dirò è possibile modificare i pulsanti al seguente:

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

Il controller:

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

Questo post non ha intenzione di rispondere alle Coppermill, perché sono stato risposto molto tempo fa. Il mio post sarà utile per chi cerca di soluzione di questo tipo. Prima di tutto, devo dire "La soluzione di WDuffy è del tutto corretto" e funziona bene, ma la mia soluzione (in realtà non il mio) verranno utilizzati in altri elementi e rende il livello di presentazione più indipendente dal regolatore (perché il controller dipendono "valore" che è usato per mostrare l'etichetta del tasto, questa caratteristica è importante per le altre lingue.).

Questa è la mia soluzione, dare loro nomi diversi:

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

E è necessario specificare i nomi dei pulsanti come argomenti nell'azione come di seguito:

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

quando l'utente invia la pagina utilizzando uno dei pulsanti, solo uno degli argomenti avranno valore. Credo che questo sarà utile per gli altri.

Aggiorna

Questa risposta è piuttosto vecchio e io in realtà riconsiderare la mia opinione. forse sopra soluzione è un bene per situazione che il passaggio dei parametri alle proprietà del modello. non si preoccupano di voi stessi e prendere la soluzione migliore per il vostro progetto.

Dare il nome di entrambi i pulsanti e di ottenere il controllo del valore dalla forma.

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

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

Sul lato controllore:

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

Nel core pagine 2.2 Razor questa sintassi funziona:

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

Non è possibile trovare utilizzando Request.Form Collection? Se il processo viene cliccato il Request.Form [ "processo"] non sarà vuoto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top