English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
A volte ci si può imbattere in questa situazione: su un form è necessario più pulsanti per completare diverse funzioni, ad esempio una funzione di approvazione semplice.
Se si utilizza un webform non c'è bisogno di discutere, ma in ASP.NET MVC un form può inviare i dati solo a un Action, il che può essere un po' complicato.
Metodo 1:Utilizzo dello script client-side
Ad esempio, possiamo scrivere così nel View:
<input type="submit" value="Approvato" onclick='this.form.action="<%=Url.Action("Action1")%>"/> <input type="submit" value="Non approvato" onclick='this.form.action="<%=Url.Action("Action2")%>" /> <input type="submit" value="Torna" onclick='this.form.action="<%=Url.Action("Action3")%>" />
Quando si fa clic sul pulsante di invio, prima si cambia l'attributo action del Form, in modo che il modulo venga inviato al gestore action corrispondente al pulsante.
Ma a volte, potrebbe essere che la logica di Action1 e 2 sia molto simile, forse solo impostare il valore di un campo a 1 o 0, quindi separare in due action sembra un po' superfluo.
Metodo due:Nel metodo Action, si giudica attraverso quale pulsante è stato inviato
Nel View, non utilizziamo alcun script client-side per gestire, e aggiungiamo la proprietà name a ogni pulsante di invio:
<input type="submit" value="Approvato" name="action" /> <input type="submit" value="Non approvato" name="action"/> <input type="submit" value="Torna" name="action"/>
Poi, nel controller, si giudica:
[HttpPost] public ActionResult Index(string action /* Altri parametri */) { if (action=="Approvato") { // } else if (action=="Non approvato") { // } else { // } }
Alcuni anni fa, scrivendo codice asp, usavo spesso questo metodo...
Il View diventa semplice, mentre il Controller diventa complesso.
Essere troppo dipendenti dal View può causare alcuni problemi. Se un giorno il cliente dice che il testo del pulsante deve essere modificato in "Approvato" o creare una versione multilingue, allora sarà complicato.
Metodo tre:Utilizzo di ActionSelector
Per comprendere i principi fondamentali di ActionSelector, si può consultare questo POST per utilizzare ActionSelector per controllare la selezione dell'azione.
Utilizzando questo metodo, possiamo scrivere il controller in questo modo:
[HttpPost] [MultiButton("action1")] public ActionResult Action1() { // return Visualizza(); } [HttpPost] [MultiButton("action2")] public ActionResult Azione2() { // return Visualizza(); }
Nel View:
<input type="submit" value="approvato" name="action1" /> <input type="submit" value="non approvato" name="action2"/> <input type="submit" value="ritorna" name="action3"/>
In questo momento, il Controller non dipende più dal valore di Value del pulsante.
La definizione di MultiButtonAttribute è la seguente:
public class MultiButtonAttribute : ActionNameSelectorAttribute { public string Name { get; set; } public MultiButtonAttribute(string name) { this.Name = name; } public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo) { if (string.IsNullOrEmpty(this.Name)) { return false; } return controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name); } }
Metodo quattro:Miglioramento
Controller:
[HttpPost] [MultiButton(Name = "delete", Argument = "id")] public ActionResult Elimina(string id) { var response = System.Web.HttpContext.Current.Response; response.Write("L'azione di eliminazione è stata invocata con " + id); return Visualizza(); }
Visualizza:
<input type="submit" value="non importante" name="delete" /> <input type="submit" value="non importante" name="delete:id" />
Definizione di MultiButtonAttribute:
codice
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class MultiButtonAttribute : ActionNameSelectorAttribute { public string Name { get; set; } public string Argument { get; set; } public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) { var key = ButtonKeyFrom(controllerContext); var keyIsValid = IsValid(key); if (keyIsValid) { UpdateValueProviderIn(controllerContext, ValueFrom(key)); } return keyIsValid; } private string ButtonKeyFrom(ControllerContext controllerContext) { var keys = controllerContext.HttpContext.Request.Params.AllKeys; return keys.FirstOrDefault(KeyStartsWithButtonName); } private static bool IsValid(string key) { return key != null; } private static string ValueFrom(string key) { var parts = key.Split(":".ToCharArray()); return parts.Length < 2 ? null : parts[1]; } private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult (value, value, null); } private bool KeyStartsWithButtonName(string key) { return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase); } } //如果是在MVC 2.0中的话,将UpdateValueProviderIn方法改为: private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.RouteData.Values[this.Argument] = value; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。