asp.net-mvc-3 – ASP.net MVC路由与可选的第一个参数
|
我需要为其中一个网站提供以下功能. http://www.example.com/ [赞助] / {控制器} / {行动} 根据[赞助商],必须定制网页. 我尝试将路由注册到Application_Start和Session_Start,但不能使其正常工作. public static void RegisterRoutes(RouteCollection routes,string sponsor)
{
if (routes[sponsor] == null)
{
routes.MapRoute(
sponsor,// Route name
sponsor + "/{controller}/{action}/{id}",// URL with parameters
new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults
);
}
}
另外,没有[sponsor]的默认行为也应该起作用. 更新代码 请注意,这仅适用于家庭控制器(双方和非赞助商).对于其他控制器/动作,即使指定了sponsor参数,它也不是路由. 请建议什么需要修改. public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"SponsorRoute","{sponsor}/{controller}/{action}/{id}",// URL with parameters
new { controller = "Home",id = UrlParameter.Optional }
);
routes.MapRoute(
"NonSponsorRoute","{controller}/{action}/{id}",new { controller = "Home",id = UrlParameter.Optional,sponsor = string.Empty }
);
}
行动方法 public ActionResult Index(string sponsor)
{
}
解决方法在您的情况下,赞助商不应被视为URL的常数部分,而应视为可变部分.在Global.asax中: public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
"SponsorRoute",id = UrlParameter.Optional }
);
routes.MapRoute(
"NonSponsorRoute",sponsor=string.Empty }
);
...
}
在你的控制器中,例如HomeController.cs: namespace YourWebApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index(string sponsor)
{
// Here you can do any pre-processing depending on sponsor value,including redirects etc.
}
...
}
}
请注意,此参数的类型将始终为System.String,并且路由模板组件{赞助者}的名称必须与控制器中操作参数字符串赞助商的名称完全相符. UPD:为非赞助者案例增加了第二条路线. 请注意,这样的设置会使您的逻辑复杂化,因为您可能会混淆不同的网址,例如URL http://www.example.com/a/b/c 可以通过两条路线匹配:第一个将有赞助者= a,controller = b和action = c;第二个将有controller = a,action = b和id = c. 如果您对URL指定了更严格的要求,则可以避免这种情况 – 例如,您可能希望ID仅为数字.限制在routes.MapRoute()函数的第四个参数中指定. 消除歧义的另一种方法是在赞助商的通用路线之前为所有控制器指定单独的路线(通常您的应用中不会有太多的控制器). UPD: 区分赞助商和非赞助商路线的最简单但最不可维护的方法是指定特定于控制器的路由,如下所示: public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
"HomeRoute","Home/{action}/{id}",sponsor=string.Empty }
);
routes.MapRoute(
"AccountRoute","Account/{action}/{id}",// URL with parameters
new { controller = "Account",sponsor=string.Empty }
);
...
routes.MapRoute(
"SponsorRoute",id = UrlParameter.Optional }
);
...
}
请注意,这里所有控制器特定的路由必须在SponsorRoute之前添加. 更复杂,更干净的方法是在@counsellorben的回答中描述,为赞助商和控制器名称实现RouteConstraints. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 是否需要在web.config中保护连接字符串?
- .net – 对象数据源或代码隐藏:哪个更好?
- 如果我的Asp.Net会话有IsNewSession == true,那我的意思是什
- asp.net-mvc – 编辑多个子记录的ASP.NET MVC示例
- 确定ASP.Net是否正确注册
- asp.net-mvc – 如何将行的模型从Kendo Grid传递到可编辑的
- asp.net – 如何传递datetime参数?
- ASP.NET MVC与WebForms:速度和架构比较
- asp.net-mvc-4 – Web API HTTP请求命名约定
- 可以按需生成ASP.NET黄色死亡屏幕(YSOD)吗?
- asp.net-mvc – 奇怪的错误w / NinjectValidator
- asp.net – 如何阻止.net中的libwww-perl访问?
- 在HiddenField asp.net中存储一个字符串数组
- asp.net – 如何获得Url.Action使用正确的端口号
- asp.net-mvc-3 – 为什么这个代码不删除布局?
- asp.net – 在日历上设置最小和最大日期?
- asp.net – 在web用户控件中传递int数组作为参数
- 是*不*使用asp.net成员资格提供程序一个坏主意?
- asp.net-mvc-5 – 在禁用的TextBoxFor中只读是什
- asp.net-mvc-3 – 如何根据当前页面和/或主页在O
