Пользовательская маршрутизация asp.net MVC 3 выпуск - PullRequest
2 голосов
/ 18 октября 2011

Я хочу, чтобы в моем методе действия был доступен мой Request.Url.Host. Однако я не хочу устанавливать его в routedata, потому что он будет виден пользователю в URL. Как я могу сделать это так, чтобы Request.Url.Host был доступен в моем доменном имени variabele, но теперь показывается пользователю в URL? Я попытался добавить его в Request.Form.Add ("домен", Request.Url.Host), но он не работает, потому что Request.Form является коллекцией только для чтения.

например:

public ActionResult Foo(string domain, int id) //id is the standard routedata that you get from url.
{
    ..//code
}

Что я могу сделать лучше всего? Я не хочу делать Request.Url.Host в каждом методе действия, поэтому я пробую этот подход.

Я пытался сделать это:

public class MyRoute : Route
    {
        #region '----- Method(s) -----'
        public MyRoute(string url, object defaults)
            : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
        { }

        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            RouteData routeData = base.GetRouteData(httpContext);

            string domain = httpContext.Request.Url.Host;

            routeData.DataTokens["domain"] = domain;

            return routeData;
        }
        #endregion
    }

Но моя переменная домена в моем методе действия имеет значение null.

Спасибо.

1 Ответ

1 голос
/ 18 октября 2011

РЕДАКТИРОВАТЬ: полное переписывание:

Вы должны добавить свои пользовательские данные в routeData.Values вместо routeData.DataTokens.

public class MyRoute : Route
{
    #region '----- Method(s) -----'
    public MyRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        RouteData routeData = base.GetRouteData(httpContext);

        string domain = httpContext.Request.Url.Host;

        routeData.Values["domain"] = domain;

        return routeData;
    }
    #endregion
}

И при регистрации маршрута MyRoute (MVC используетпервый соответствующий маршрут, поэтому он должен идти первым):

routes.Add(new MyRoute("{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...