【问题标题】:Different MVC4 action based on GET variable基于 GET 变量的不同 MVC4 动作
【发布时间】:2013-03-20 15:37:23
【问题描述】:

有没有办法让 MVC4 根据 URL 中的 GET 变量调用不同的操作?

例如,假设我有以下两个动作。

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

更新:
我非常清楚我可以按原样使用操作/网址,并通过路由来实现它(这就是我现在正在做的事情),但我对问题的 GET vars 部分真的很感兴趣。

【问题讨论】:

  • http://MySite/Submit/Crash 适合您吗?您可以通过自定义路由表条目来实现这一点。
  • 是的,我现在就是这样做的,但这并不能回答我的问题。

标签: c# asp.net-mvc-4 asp.net-mvc-routing


【解决方案1】:

它并不像它应该的那样整洁,但您可以为此使用“root”操作:

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

【讨论】:

  • 这很酷,而且罗嗦。我得出的结论是 MVC4 没有内置的方法来处理我的场景是吧?
【解决方案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",
                });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2018-08-21
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多