6

URL の GET 変数に基づいて MVC4 にさまざまなアクションを呼び出させる方法はありますか?

たとえば、次の 2 つのアクションがあるとします。

[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')

更新:
アクション/ URLをそのまま使用し、それを実現するためにルーティングを行うことができることを非常に認識しています(これは私が現在行っていることです)が、のGET vars部分に本当に興味があります質問。

4

2 に答える 2

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);
    }
}
于 2013-03-20T18:12:44.233 に答える
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",
                });
于 2013-03-20T16:08:12.637 に答える