是否可以在运行时动态指定动作名称?

Met*_*uru 1 asp.net-mvc action uri controller

string actionName = "Users";

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

}
Run Code Online (Sandbox Code Playgroud)

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

这只是一个测试,有没有办法做到这一点?如果是这样,我可以重新使用相同的Controller并可能动态创建新的URI ...对吗?

Dar*_*rov 5

假设您有以下控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以写一个自定义路由处理程序:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后将自定义路由处理程序与路由定义相关联:

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

现在,如果您要求/home/users它将是将要服务IndexHome控制器的动作.