Можно ли динамически указывать имена действий во время выполнения? - PullRequest
1 голос
/ 15 июня 2011
string actionName = "Users";

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

}

... дает: ссылка на объект требуется для нестатического поля, метода или свойства

Это был всего лишь тест, есть ли способ сделать это? Если это так, я мог бы повторно использовать тот же контроллер и, возможно, создать новые URI на лету ... верно?

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

При условии, что у вас есть следующий контроллер:

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, то будет выполнено действие Index контроллера Home.

0 голосов
/ 15 июня 2011

Вы можете просто взять другой аргумент маршрутизации и выполнить оператор switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...