传递一个{SITENAME}参数MVC控制器动作 [英] Passing a {sitename} parameter to MVC controller actions

查看:104
本文介绍了传递一个{SITENAME}参数MVC控制器动作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怎么能检索的站点范围内的URL路由中的参数而不会弄乱每个控制器的行动,参数?我的问题是类似这个问题,但我想避免的 ModelBinder的的混乱。 IE浏览器。在的Global.asax.cs 的:

  routes.MapRoute(
    默认,//路线名称
    {网站名称} / {控制器} / {行动} / {ID}
    新{网站名称=,控制器=SomeController,行动=索引,ID =});

所以,与其在SomeController类以下内容:

 公众的ActionResult指数(字符串站点名)
{
    SiteClass网站= GetSite(网站名);
    ...
    返回查看(site.GetViewModel());
}

我宁愿有以下内容:

 公众的ActionResult指数()
{
    SiteClass网站= CurrentSite; //其中CurrentSite已经检索的基础上唯一的URL站点名称参数数据。
    ...
    返回查看(site.GetViewModel());
}

这或许可以控制范围内的动作过滤器可以实现吗? OnActionExecuting?


解决方案

首先添加路由到Global.aspx.cs传递一个{SITENAME}参数:

  routes.MapRoute(
    网站,//路线名称
    {网站名称} / {控制器} / {行动} / {ID},// URL带参数
    新{网站名称=,控制器=家,行动=索引,ID =} //参数默认
);

然后添加以下简单code基本控制器内:

 公共类BaseController:控制器
{
    公共字符串网站名称=;    保护覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
    {
        HTT prequestBase REQ = filterContext.HttpContext.Request;
        网站名称= filterContext.RouteData.Values​​ [网站名称作为字符串;
        base.OnActionExecuting(filterContext);
    }
}

而在你的派生的控制器使用方法:

 公共类HomeController的:BaseController
{
    公众的ActionResult指数()
    {
        计算机[网站名称] =网站名称;
        返回查看();
    }
}

How can I retrieve a site-wide URL parameter in a route without cluttering each controller action with a parameter? My question is similar to this question, but I want to avoid the ModelBinder clutter. Ie. in Global.asax.cs:

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

So, instead of the following in SomeController class:

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

I would rather have the following:

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

Perhaps this can be achieved with controller-wide action filter? OnActionExecuting?

解决方案

First add a route to Global.aspx.cs to pass a {sitename} parameter:

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

Then add the following simple code inside a base controller:

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);
    }
}

And use in your derived controller:

public class HomeController: BaseController
{
    public ActionResult Index()
    {
        ViewData["SiteName"] = SiteName;
        return View();
    }
}

这篇关于传递一个{SITENAME}参数MVC控制器动作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆