2013-03-20 9 views
6

Gibt es eine Möglichkeit, MVC4 dazu zu bringen, verschiedene Aktionen auf Basis einer GET-Variable in der URL aufzurufen?Andere MVC4-Aktion basierend auf der GET-Variablen

Zum Beispiel sagen wir, ich habe die folgenden zwei Aktionen.

Gibt es eine Möglichkeit, die folgenden URLs zu verwenden, damit MVC4 wählt, welche Aktion aufgerufen wird?

http://MySite/Submit?Crash (calls 'SubmitCrash') 
http://MySite/Submit?Bug (calls 'SubmitBug') 

UPDATE:
Ich bin sehr bewusst, dass ich Aktionen verwenden können/URLs, wie sie sind, und tun Dinge mit Routing, um sie geschehen (das ist, was ich jetzt tue), aber Ich bin wirklich interessiert an der GET Vars Teil der Frage.

+1

Ist 'http: // MySite/Submit/Crash' eine Option für Sie? Sie können dies mit einem benutzerdefinierten Routentabelleneintrag erreichen. –

+0

ja, wie ich es jetzt mache, aber das beantwortet meine Frage nicht. –

Antwort

2

Es ist nicht so sauber wie es sein könnte, aber man kann ‚root‘ Aktion für diesen Einsatz:

public ActionResult Submit(string method) 
{ 
    return Redirect("Submit"+method); 
} 

public ActionResult SubmitCrash() 
{ 
    return View(); 
} 

public ActionResult SubmitBug() 
{ 
    return View(); 
} 

bearbeiten
Ich habe ActionNameAttribute erweitern Ihre Bedürfnisse zu erfüllen, Sie so kann dies schreiben:

//handles http://MySite/Submit?method=Crash 
[ActionNameWithParameter(Name = "Submit", ParameterName = "method", ParameterValue = "Crash")] 
public ActionResult SubmitCrash() 
{ 
    return View(); 
} 

//handles http://MySite/Submit?method=Bug 
[ActionNameWithParameter(Name = "Submit", ParameterName = "method", ParameterValue = "Bug")] 
public ActionResult SubmitBug() 
{ 
    return View(); 
} 

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class ActionNameWithParameterAttribute : ActionNameSelectorAttribute 
{ 
    public string Name 
    { 
     get; 
     private set; 
    } 
    public string ParameterName 
    { 
     get; 
     private set; 
    } 
    public string ParameterValue 
    { 
     get; 
     private set; 
    } 
    public ActionNameAttribute(string name, string parameterName, string parameterValue) 
    { 
     if (string.IsNullOrEmpty(name)) 
     { 
      throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); 
     } 
     this.Name = name; 
     this.ParameterName = parameterName; 
     this.ParameterValue = parameterValue; 
    } 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     return string.Equals(actionName, this.Name, StringComparison.OrdinalIgnoreCase) 
      && string.Equals(controllerContext.HttpContext.Request.QueryString.Get(ParameterName) 
       , this.ParameterValue 
       , StringComparison.OrdinalIgnoreCase); 
    } 
} 
+0

Das ist ziemlich cool und wortreich. Ich komme zu dem Schluss, dass MVC4 keine eingebaute Möglichkeit hat, mit meinem Szenario fertig zu werden, oder? –

2

Warum nicht Routen erstellen, um dies zu tun?

routes.MapRoute(
      name: "SubmitCrash", 
      url: "Submit/Crash", 
      defaults: new 
       { 
        Action = "SubmitCrash", 
        Controller = "NameOfController", 
       }); 

    routes.MapRoute(
      name: "SubmitBug", 
      url: "Submit/Bug", 
      defaults: new 
       { 
        Action = "SubmitBug", 
        Controller = "NameOfController", 
       });