从ASP.NET MVC中,是否可以基于访问设备/浏览器路由到不同的控制器或操作?
我正在考虑为我的网站的某些部分设置替代操作和视图,以防从iPhone访问它,以优化它的显示和功能.我不想为iPhone创建一个完全独立的项目,因为大多数网站在任何设备上都可以.
有关如何做到这一点的任何想法?
我有一个网址
我想变成
这也可能是http://www.roadkillwiki.org/Page/my-url-with-spaces - 参数是一个字符串.我尝试过的路线设置是:
routes.MapRoute(
"ControllerDefault",
"{controller}/{id}",
new { controller = "Page", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
然而,这干扰了MVC项目带来的默认"id"路由.有没有办法实现这个目标?
我正在尝试将int []数组添加到我的Url.Action中,如下所示:
var routeData = new RouteValueDictionary();
for (int i = 0; i < Model.GroupsId.Length; i++) {
routeData.Add("GroupsId[" + i + "]", Model.GroupsId[i]);
}
Run Code Online (Sandbox Code Playgroud)
在我看来:
Url.Action("Index", routeData)
Run Code Online (Sandbox Code Playgroud)
但在html我得到:
GroupsId%5B0%5D=1213&GroupsId%5B0%5D=1214
Run Code Online (Sandbox Code Playgroud)
并不是:
GroupsId=1213&GroupsId=1214
Run Code Online (Sandbox Code Playgroud)
我需要它,因为我有一个复选框列表,当我发布时我将groupIds绑定到int [],然后传递给我查看我有导出按钮的地方,其中Url.Action对我来说无法正常工作.
使用ASP.NET MVC(3或4DP)中的开箱即用方法定位器,有没有办法让MVC框架区分字符串和Guid而无需解析控制器操作中的参数?
用法示例适用于URL
执行
public ActionResult Details(Guid guid)
Run Code Online (Sandbox Code Playgroud)
方法,和
执行
public ActionResult Details(string id)
Run Code Online (Sandbox Code Playgroud)
方法.
没有任何变化,显然这些方法含糊不清,如下:
public ActionResult Details(Guid id)
{
var model = Context.GetData(id);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
导致错误:
The current request for action 'Details' on controller type 'DataController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Details(System.Guid) on type Example.Web.Controllers.DataController
System.Web.Mvc.ActionResult Details(System.String) on type Example.Web.Controllers.DataController
Run Code Online (Sandbox Code Playgroud)
我尝试使用自定义约束(基于如何创建System.Guid类型的路由约束?)尝试通过路由推送它:
routes.MapRoute(
"Guid", …Run Code Online (Sandbox Code Playgroud) 我收到此错误"在路径集合中找不到名为'MemberRoute'的路径.参数名称:name".这是我的Global.asax,
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
"MemberRoute", // routeName
"member/{userId}/{pseudoName}", // url
new
{ // url defaults
controller = "Member",
action = "Index",
userId = 0,
pseudoName = UrlParameter.Optional
},
new
{ // url constraints
userId = @"\d+" // must match url {userId}
}
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Run Code Online (Sandbox Code Playgroud)
MemberController,
public ActionResult Index(int userId, string pseudoName)
{
User user;
var unitOfWork = new UnitOfWork();
user …Run Code Online (Sandbox Code Playgroud) 我想维护ASP.NET MVC 4的现有控制器/动作/ id路由,默认控制器= Home和默认动作=索引,但是只要第二项不是,就可以使控制器/ id路由到控制器的索引方法一个已知的行动.
例如,给定一个带有动作索引和发送的控制器Home:
/Home/Send -> controller's Send method
/Home -> controller's Index method
/Home/Send/xyz -> controller's Send method with id = xyz
/Home/abc -> controller's Index method with id = abc
Run Code Online (Sandbox Code Playgroud)
但是,如果我先定义任一路线,它会隐藏另一条路线.我该怎么做?
我们使用ASP.NET MVC Futures项目(Microsoft.Web.Mvc)来使MVC 3应用程序能够使用RESTful路由.此应用程序已在MVC 1及其相关的System.Web.Mvc.Resources.dll程序集下完美地工作,以实现相同的功能.
我们正在注册这些路线:
routes.MapResourceRoute("MyController", "{MyItemId}");
Run Code Online (Sandbox Code Playgroud)
哪个应该给我们的路线,如:
/MyController
/MyController/{MyItemId}
/MyController/{MyItemId}/EditForm
/MyController/CreateForm
Run Code Online (Sandbox Code Playgroud)
我们得到四个有效路由中的三个 - 该列表中的第二个路径(/ MyController/{MyItemId})返回错误:
Server Error in '/' Application.
The RouteData must contain an item named 'action' with a non-empty string value.
Run Code Online (Sandbox Code Playgroud)
当我尝试追加?action = Details或其他向URL注入动作参数的方法时,我得到404错误.看起来Futures代码中的WebEnabledApi属性发生了显着变化 - 其他任何有这些问题的人都有解决方案吗?
我想为我们的网络应用程序设计网址提供一些专家建议.这不是公共域名网站,它是基于供应链内联网的Web应用程序,仅由一组经过身份验证的用户使用.
这是一些例子 -
/Claim/12/Manage
FORMAT: controller/{ID}/action
Run Code Online (Sandbox Code Playgroud)
指向"Claim Entry"向导的url.这里"12"是ClaimID.它进一步分为用于子数据输入的选项卡.示例:/ Claim/12/Print,/ Claim/12/FileDetails,...
/Users/List
FORMAT: controller/action
Run Code Online (Sandbox Code Playgroud)
显示Grid中的现有用户列表.这个缩写为"/ Users"?同样,我们还有其他一些实体,比如"角色,组织等......"
/Master/Manage/FileType
FORMAT: controller/action/{argument}
Run Code Online (Sandbox Code Playgroud)
我们有一个页面,允许用户管理不同的主表数据.需要知道选择哪个主表(即作为参数发送).是否更好地将其简化为"/ Manage/{argument}",然后根据上面的要求映射该URL?
任何通用指南或参考文献也都很棒.
参考:Web服务URL - (部分:设计URI模板) http://msdn.microsoft.com/en-us/library/dd203052.aspx
我在我的控制器中使用MVC5的属性路由.
有没有办法控制控制器之间的属性路由优先级?
考虑以下
[Route("home/{action=index}/{username?}")]
public class HomeController : Controller
{
[Route("home/index/{username?}", Order = 1)]
[Route("home/{username?}", Order = 2)]
[Route("{username?}", Order = 3)]
public ActionResult Index()
{
// ... bunch of stuff
}
}
Run Code Online (Sandbox Code Playgroud)
根据上面的代码,HomeController.Index()应使用以下请求调用action方法:
第二控制器:
[Authorize(Roles = "Member")]
[Route("profile/{action=index}")]
public class ProfileController : Controller
{
[Route("profile")]
public ActionResult Index()
{
}
}
Run Code Online (Sandbox Code Playgroud)
本ProfileController.Index()应使用下面的请求来调用.
从示例中,如果我发送domain/profile了url,则会引发歧义异常.似乎domain/{username}和之间存在歧义domain/profile …
我想测试一个URL是否是在中定义的路由的一部分Global.asax.这就是我所拥有的:
var TheRequest = HttpContext.Current.Request.Url.AbsolutePath.ToString();
var TheRoutes = System.Web.Routing.RouteTable.Routes;
foreach (var TheRoute in TheRoutes)
{
if (TheRequest == TheRoute.Url) //problem here
{
RequestIsInRoutes = true;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法从路由中提取URL.我需要改变什么?