Zu den Aktionen mit denselben Namen, aber unterschiedlichen Parametern verzweigen
Habe ich diesen Satz von Routen:
routes.MapRoute(
"IssueType",
"issue/{type}",
new { controller = "Issue", action = "Index" }
);
routes.MapRoute(
"Default", //Route name
"{controller}/{action}/{id}", //URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Parameter defaults
);
Hier ist die controller-Klasse:
public class IssueController : Controller
{
public ActionResult Index()
{
//todo: redirect to concrete type
return View();
}
public ActionResult Index(string type)
{
return View();
}
}
warum, wenn ich bitte http://host/issue bekomme ich The current request for action 'Index' on controller type 'IssueController' is ambiguous between the following action methods:
Ich erwarte, dass zunächst eine Methode handeln sollte, wenn es keine Parameter, und das zweite, wenn einige parameter angegeben.
wo habe ich Fehler gemacht?
UPD: mögliche Duplikate: Können Sie überlastung controller-Methoden in ASP.NET MVC?
UPD 2: aufgrund der obigen link - es gibt keine rechtliche Möglichkeit, um action-überladen, ist es?
UPD 3: Action-Methoden nicht überladen werden, basierend auf Parametern, (c) http://msdn.microsoft.com/en-us/library/system.web.mvc.controller%28VS.100%29.aspx
InformationsquelleAutor der Frage zerkms | 2010-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hätte ich eine Index-Methode sieht, die für eine gültige variable vom Typ
EDIT:
Kreieren Sie ein benutzerdefiniertes Attribut, das sieht für eine bestimmte Anfrage Wert, wie in diesem Beitrag StackOverflow
InformationsquelleAutor der Antwort Tommy
Lief ich in eine ähnliche situation, wo ich wollte, dass meine "Index" - Aktion für den Umgang mit dem Rendern wenn ich eine ID angegeben wird oder nicht. Die Lösung kam ich auf war, um die ID-parameter der Index-Methode optional.
Zum Beispiel habe ich ursprünglich versucht, mit beiden:
und eben habe ich Sie kombiniert und verändert es:
InformationsquelleAutor der Antwort jgreg311
Kann man es mit einem ActionFilterAttribute, prüft die Parameter mit der spiegelung (ich versuchte es), aber es ist eine schlechte Idee. Jede einzelne Aktion sollte einen eigenen Namen.
Warum nicht einfach rufen Sie Ihre beiden Methoden "Index" und "Single", sagen Sie, und Leben mit der Einschränkung auf die Benennung?
Im Gegensatz zu Methoden, die gebunden sind, zur compile-Zeit basierend auf übereinstimmenden Signaturen, eine fehlende route-Wert am Ende wird behandelt wie eine null.
Wenn Sie möchten, dass der [hack] ActionFilterAttribute entspricht Parameter lassen Sie mich wissen und ich werde einen link posten, aber wie ich schon sagte, es ist eine schlechte Idee.
InformationsquelleAutor der Antwort Ian Mercer
Alles, was Sie tun müssen ist, markieren Sie Ihre zweite Aktion mit [HttpPost]. Zum Beispiel:
InformationsquelleAutor der Antwort 010110110101