2013-03-20 28 views
6

有沒有辦法讓MVC4根據URL中的GET變量調用不同的操作?基於GET變量的不同MVC4操作

例如,假設我有以下兩個操作。

[HttpPost] 
public ActionResult SubmitCrash(CrashReport rawData) 
{ 
    return View(); 
} 


[HttpPost] 
public ActionResult SubmitBug(BugReport data) 
{ 
    return View(); 
} 

有沒有一種方法可以使用下面的URL讓MVC4'選擇'要調用哪個動作?

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

UPDATE:
我非常清楚,我可以使用動作/網址他們,並且做的東西與路由做到這一點(這是我現在做)的方式,但我對GET vars部分問題非常感興趣。

+1

是否有'http:// MySite/Submit/Crash'選項給你?您可以使用自定義路由表條目來實現此目的。 – 2013-03-20 15:58:50

+0

是的,它是如何做到的,但是這並不能回答我的問題。 – 2013-03-20 17:59:57

回答

2

這不是整齊,因爲它可以,但你可以使用這個「根」的行動:

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

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

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

編輯
我不得不延長ActionNameAttribute滿足您的需求,讓你可能會這樣寫:

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

這很酷,羅嗦。我得出的結論是,MVC4沒有內置的方式來處理我的場景吧? – 2013-03-20 20:02:50

2

爲什麼不創建路線來做到這一點?

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