【问题标题】:Is it possible to specify Action names dynamically at run time?是否可以在运行时动态指定动作名称?
【发布时间】:2011-06-15 17:55:36
【问题描述】:
string actionName = "Users";

[HttpGet]
[ActionName(actionName)]
public ActionResult GetMe()
{

}

...gives:非静态字段、方法或属性需要对象引用

这只是一个测试,有没有办法做到这一点?如果是这样,我可以重新使用相同的控制器,并可能即时创建新的 URI……对吗?

【问题讨论】:

    标签: asp.net-mvc controller uri action


    【解决方案1】:

    假设您有以下控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
    

    您可以编写自定义路由处理程序:

    public class MyRouteHander : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            var rd = requestContext.RouteData;
            var action = rd.GetRequiredString("action");
            var controller = rd.GetRequiredString("controller");
            if (string.Equals(action, "users", StringComparison.OrdinalIgnoreCase) &&
                string.Equals(controller, "home", StringComparison.OrdinalIgnoreCase))
            {
                // The action name is dynamic
                string actionName = "Index";
                requestContext.RouteData.Values["action"] = actionName;
            }
            return new MvcHandler(requestContext);
        }
    }
    

    最后在你的路由定义中关联自定义路由处理器:

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    ).RouteHandler = new MyRouteHander();
    

    现在,如果您请求 /home/users,则将提供 Home 控制器的 Index 操作。

    【讨论】:

      【解决方案2】:

      您可以只使用另一个路由参数并执行 switch 语句。

      【讨论】:

      • 如果我做了一个 switch 语句不是意味着我需要提前知道 URI 吗?
      • 不完全是。你让控制器手动处理路由。
      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2015-05-25
      • 2012-06-16
      相关资源
      最近更新 更多