Как я могу изменить значение маршрута, а затем перенаправить на этот маршрут? - PullRequest
3 голосов
/ 21 сентября 2010

У меня есть UserAccountController, который принимает маршруты, подобные этому "/{username}/{action}".

Я хотел бы создать некоторые функции, чтобы я мог перевести пользователя на страницу, относящуюся к учетной записи, не зная заранее его имени пользователя.Я хотел бы иметь возможность использовать URL "/your/{action}", который уловил бы тот факт, что "ваше" было отправлено в качестве их имени пользователя, получило их реальное имя пользователя (потому что они вошли в систему) и перенаправило их на "/ их-фактический-username / {action} ".

Я мог бы сделать это в каждом из действий контроллера, но я бы предпочел, чтобы это произошло в каком-то месте ранее, которое бы делало это для всех действий контроллера.Я попытался сделать это в методе контроллера Initialize, изменив RouteData.Values["username"] на реальное имя пользователя, а затем попытавшись Response.RedirectToRoute(RouteData); Response.End(), но это всегда приводило меня в неправильное место (какой-то совершенно неправильный маршрут).


Обновлено: Спасибо BuildStarted за подсказку:

public class UserAccountController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if ((string) filterContext.RouteData.Values["username"] != "your") 
            return;

        var routeValues = new RouteValueDictionary(filterContext.RouteData.Values);
        routeValues["username"] = UserSession.Current.User.Username;
        filterContext.Result = new RedirectToRouteResult(routeValues);
    }
}

1 Ответ

5 голосов
/ 21 сентября 2010

Вы можете использовать FilterAttribute с IActionFilter, чтобы выполнить то, что вы хотите.

public class UserFilterAttribute : FilterAttribute, IActionFilter  {
    public void OnActionExecuted(ActionExecutedContext filterContext) {
    }

    public void OnActionExecuting(ActionExecutingContext filterContext) {
        var username = filterContext.RouteData.Values["username"];
        var realUserName = ""; //load from database
        filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "Users", action = "Index", username = realUserName }));
    }
}

Затем на вашем ActionResult в вашем контроллере вы можете применить [UserFilter] к действию.

[UserFilter]
public ActionResult UnknownUserHandler() {
    return View();
}

Это должно дать вам результаты, которые вы ищете.По любым вопросам пишите:)

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