Передача параметра {sitename} в действия контроллера MVC - PullRequest
2 голосов
/ 10 февраля 2010

Как я могу получить параметр URL для всего сайта в маршруте, не загромождая каждое действие контроллера параметром? Мой вопрос похож на этот вопрос , но я хочу избежать беспорядка ModelBinder . То есть. в Global.asax.cs :

routes.MapRoute(
    "Default", // Route name
    "{sitename}/{controller}/{action}/{id}",
    new { sitename = "", controller = "SomeController", action = "Index", id = "" }    );

Итак, вместо следующего в классе SomeController:

public ActionResult Index(string sitename)
{
    SiteClass site = GetSite(sitename);
    ...
    return View(site.GetViewModel());
}

Я бы предпочел следующее:

public ActionResult Index()
{
    SiteClass site = CurrentSite; // where CurrentSite has already retrieved data based on unique URL sitename parameter.
    ...
    return View(site.GetViewModel());
}

Возможно, этого можно достичь с помощью фильтра действий на уровне контроллера? OnActionExecuting

Ответы [ 2 ]

4 голосов
/ 10 февраля 2010

Сначала добавьте маршрут в Global.aspx.cs, чтобы передать параметр {sitename}:

routes.MapRoute(
    "Sites", // Route name
    "{sitename}/{controller}/{action}/{id}", // URL with parameters
    new { sitename = "", controller = "Home", action = "Index", id = "" } // Parameter defaults
);

Затем добавьте следующий простой код в базовый контроллер:

public class BaseController: Controller
{
    public string SiteName = "";

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase req = filterContext.HttpContext.Request;
        SiteName = filterContext.RouteData.Values["sitename"] as string;
        base.OnActionExecuting(filterContext);
    }
}

И используйте в своем производном контроллере:

public class HomeController: BaseController
{
    public ActionResult Index()
    {
        ViewData["SiteName"] = SiteName;
        return View();
    }
}
0 голосов
/ 21 января 2014

Возможно, я неправильно понимаю вопрос, но почему бы просто не сделать следующее внутри действия вашего контроллера:

var sitename = RouteData.Values["sitename"] as string;

Я не понимаю, почему вам нужно переопределить OnActionExecuting (за ответ @ pate), когда вы можете получить значение, когда вам это нужно.

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

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