我有一个ASP.NET MVC站点,我想要路由/{controller}/{id}/{action}/{date},其中"date"是日期/时间的mm/dd/yyyy部分.(我正在处理时间尺寸的数据,所以我需要一个ID和一个时间点来完成大多数操作)
这个的路线很简单:
routes.MapRoute(
"TimeDimensionedRoute",
"{controller}/{id}/{action}/{date}",
new { controller = "Iteration", action = "Index", id = String.Empty, date = String.Empty }
);
Run Code Online (Sandbox Code Playgroud)
此路线正确地将" / Foo/100/Edit/01%2F21%2F2010 " 映射到所需的操作.更新:这是不正确的.这没有正确路由,我错了.请参阅已接受答案中链接的相关问题.
我的问题是,当我使用Html.ActionLink()生成此路由的链接时,它不会对日期进行URL编码,最终会出现无效的URL,例如" / Foo/100/Edit/01/21/2010 ".
有没有办法让路由基础设施为我编码值?我必须手动对我传递给HTML帮助程序的数据进行URL编码似乎是错误的.
我正在尝试创建看起来像这样的URI:
http://hostname/mobile/en/controller/action用于移动设备或http://hostname/en/controller/action用于桌面(非移动设备).
我的路由表目前看起来像这样(Global.asax.cs)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Mobile", // Route name
"mobile/{language}/{controller}/{action}/{id}", // URL with parameters
new { language = "en", controller = "Route", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { language = @"en|us" } // validation
);
routes.MapRoute(
"Default", // Route name
"{language}/{controller}/{action}/{id}", // URL with parameters
new { language = "en", controller = "Route", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { language = @"en|us" } // validation …Run Code Online (Sandbox Code Playgroud) 我的区域有两条路线,一条是自定义路线,一条是默认后备路线,见下文
var dashboardRoute = new DashboardRoute(
ObjectFactory.GetInstance<PathResolver>(),
ObjectFactory.GetInstance<VirtualPathResolver>(),
null);
context.Routes.Add(dashboardRoute);
context.Routes.MapRoute(
"Dashboard_Default", // Route name
"dashboard/{controller}/{action}/{id}", // URL with parameters
new { controller = "pages", action = "index", id = UrlParameter.Optional, area = "Dashboard" } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)
当我使用context.Routes.Add/MapRoute添加两个路由时,最后一个路由不起作用,但是当我在最后一个路由上使用context.MapRoute时它工作但我的自定义路由中的GetVirtualPath不用于actionlinks.我认为MapRoute只是context.Routes.Add的扩展?调试路由的最佳方法是什么?我已经使用了Phil Haacks路由调试,但它不适用于我的自定义路由,有没有其他方法来调试路由?
我真的需要一些帮助.我的仪表板区域中的路线注册如下所示 -
var dashboardRoute = new PagesRoute(
ObjectFactory.GetInstance<PathResolver>(),
ObjectFactory.GetInstance<VirtualPathResolver>(),
null);
context.Routes.Add("Dashboard", dashboardRoute);
context.MapRoute(
"Dashboard_default",
"dashboard/{controller}/{action}/{id}",
new { controller = "dashboard", action = "index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
PageRoute是一个自定义路线,你可以在这里找到代码http://bit.ly/er6HPn 这条路线有效,这样的链接很好用Html.ActionLink("管理角色","manageroles","帐户")但是当我有一个应该使用我的自定义路由的链接,如Html.ActionLink(page.MetaData.Name,"edit","pages",new {document = page},null)时,结果为http:// stormbreaker. local/dashboard/pages/edit?document …
我在我的一个控制器的动作中有一个String,代表一个引用URL.当前请求的路由数据不是我正在寻找的(因为它是从另一个视图中的脚本标记调用的).
我想找到引用Url的Action和Controller.
我有什么方法可以手动使用像"/ Product/23"这样的字符串来查找控制器并将字符串作为url生成的操作?
在操作中操作数据时,通常会收到一个ID作为参数,但是您需要对该ID进行一些错误处理.您必须为每个操作执行的错误处理之一是确保ID高于0(不是负数).因此,我不想在动作中处理这个问题,而是想添加一个路由约束,这样如果它是一个负id,就不会路由到该动作.
这是我的代码:
//route definition
routes.MapRoute(
"default route" ,
"{controller}/{action}/{id}" ,
new { id = UrlParameter.Optional },
new { id = @"^\d+$" }
);
//action definition (note I also tried with only [HttpPost] and with nothing same result
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get )]
public ActionResult Edit( int id )
Run Code Online (Sandbox Code Playgroud)
当你对动作执行GET操作时,一切正常,但是当我发布POST时,我会得到以下错误,它应该只是转到404页面
HTTP verb POST used to access path '/object/edit/-2' is not allowed.
[HttpException (0x80004005): The HTTP verb POST used to access path '/object/edit/-2' is not allowed.]
System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback …Run Code Online (Sandbox Code Playgroud) 我想在@ Url.Action方法中传递一个javascript变量作为路由参数.
我喜欢将screenmode javascript变量作为路由参数传递给我的action方法.
我有一个带有ScreenMode枚举属性的视图模型,基于它我应该在Ajax中调用一个动作.我还需要传递一个javascript变量作为路由的参数.
这是我尝试并得到编译错误.
当前上下文中不存在名称"screenMode"
$("#role-detail-form").submit(function (e) {
if ($(this).valid()) {
var screenMode = 0;
@{
if (Model.ScreenMode == UI.ViewModel.ScreenMode.New)
{
<text>
screenMode =2;
</text>
}
}
$.post('@Url.Action("SaveRoleDetail", new { mode=screenMode})',
$(this).serialize(), function (data) {
$("#role-detail").html(data);
$.validator.unobtrusive.parse($("#role-detail"));
});
}
e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)
我的行动是
public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode)
{
}
Run Code Online (Sandbox Code Playgroud) 我们有一个长期运行的ASP.NET Web表单应用程序,它诞生于.NET 1.1/IIS6时代.我们现在使用的是.NET4.5/IIS7,但我们对MVC一无所知.
我们为客户提供目录,并为他们提供可以使用的URL:
www.ourhost.com/customername
Run Code Online (Sandbox Code Playgroud)
使用我们开发的自定义IHttpModule,我们从URL中提取"customername"以在数据库中查找客户.然后,该客户的ID将存储在页面的上下文*中,并由网站上的几乎所有页面使用,以便为该客户自定义内容.完成此过程后,上述URL将被重写并处理为
www.ourhost.com/index.aspx
Run Code Online (Sandbox Code Playgroud)
index.aspx可以通过其上下文访问客户的ID,它可以做到这一点.
这很好用,我们用它支持数千名客户.重写逻辑相当复杂,因为它验证了客户帐户,如果客户无效,则重定向到"哦"页面,如果客户没有付款,则重定向到"查找经销商"页面等.
现在我想构建一些Web API控制器,MVC风格的重写令我担心.我看到很多例子,其中重写恰好使URL像这样工作:
www.ourhost.com/api/{controller}
Run Code Online (Sandbox Code Playgroud)
但我仍然需要在客户的环境中发生这些web api'调用'.我们的页面使用JSON/AJAX异步调用变得越来越复杂,但在回答这些调用时,我仍然需要客户上下文.我想要的URL是
www.ourhost.com/customername/api/{controller}
Run Code Online (Sandbox Code Playgroud)
但我很困惑如何配置路由来做到这一点,并让它与我们的IHttpModule很好地配合.
这甚至可能吗?
*更新:当我说"存储在页面上下文中"时,我指的是与每个Web请求相关联的HttpContext,其中包含一个字典,我可以在其中存储一些页面/请求特定的数据.
我有一个名为controller的控制器Registration和一个action方法,如下所示:
public JsonResult GetReqs(GridSettings gridSettings, int rt)
{
...//whatever
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
所以我添加了一条路线,现在我RouteConfig.cs是这样的:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "RegReq",
url: "{Registration}/{GetReqs}/{rt}",
defaults: new { controller = "Registration", action = "GetReqs", rt = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我无法访问rt参数并且GetReqs未调用action方法(我在其上设置了一个断点但没有发生任何事情).哪里出错了?
编辑:链接示例我试过:~/Registration/GetReqs/1
默认情况下,MVC中的URL路由是{controller}/{action}/{id}.然后我们可以访问mydomain.com/Products/Details/1等.
现在,我已经注册了另一个名为CategoryLandingPage的地图路线.
routes.MapRoute(
name: "CategoryLandingPage",
url: "category",
defaults: new { controller = "Category", action = "Index" });
Run Code Online (Sandbox Code Playgroud)
因此它将显示页面中的所有类别.
然后我注册另一个名为CategoryDetails的地图路线
routes.MapRoute(
name: "CategoryDetails",
url: "category/{categoryName}",
defaults: new { controller = "Category", action = "Details", categoryName = UrlParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
当有人访问mydomain.com/category/cars时,它将显示与汽车相关的所有产品.
同一个控制器还有另一个操作,如创建,编辑,删除等.
问题是,当我访问mydomain.com/category/create时,它将转到Details操作.它不会转到类别控制器中的创建操作.
我怎么能解决这个问题呢?
我有一个网址http://localhost/Home/DomSomething?t=123&s=TX ,我想将此网址路由到以下操作方法
public class HomeController
{
public ActionResult DoSomething(int taxYear,string state)
{
// do something here
}
}
Run Code Online (Sandbox Code Playgroud)
由于查询字符串名称与操作方法的参数名称不匹配,因此请求不会路由到操作方法.
如果我改变网址(仅用于测试)http://localhost/Home/DomSomething?taxYear=123&state=TX然后它的工作.(但我没有权限更改请求.)
我知道有一个Route属性,我可以申请的操作方法,并可以映射t到taxYear和s到state.
但是,我没有为此映射找到Route属性的正确语法,有人可以帮忙吗?