Asp.net mvc 将{sitename}参数传递给MVC控制器操作

Asp.net mvc 将{sitename}参数传递给MVC控制器操作,asp.net-mvc,routing,Asp.net Mvc,Routing,如何在路由中检索站点范围的URL参数,而不使每个控制器操作都与参数混淆?我的问题与类似,但我想避免ModelBinder的混乱。即,在Global.asax.cs中: 因此,与SomeController类中的以下内容不同: public ActionResult Index(string sitename) { SiteClass site = GetSite(sitename); ... return View(site.GetViewModel()); } 我希望

如何在路由中检索站点范围的URL参数,而不使每个控制器操作都与参数混淆?我的问题与类似,但我想避免ModelBinder的混乱。即,在Global.asax.cs中:

因此,与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?

首先将路由添加到Global.aspx.cs以传递{sitename}参数: 然后在基本控制器中添加以下简单代码: 并在派生控制器中使用:
也许我误解了这个问题,但为什么不在控制器操作中简单地执行以下操作:

var sitename = RouteData.Values["sitename"] as string;
我不明白,当您可以在需要时检索值时,为什么需要重写OnActionExecuting(根据@pate的回答)


也没有必要创建一个基类并从中派生所有内容。如果您反对将该行复制到每个控制器的每个操作方法中,为什么不创建一个扩展方法?

如果用户经过身份验证,那么为什么不使用Membership.GetUser()参数与身份验证无关。如果我使用{sitename}而不是{user}作为示例,可能会更清楚。不确定这是否是最好的方法,但它比破解打开的应用程序更有效。在我的实现中,我不使用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();
    }
}
var sitename = RouteData.Values["sitename"] as string;