标签: asp.net-mvc-routing

如何使ASP.NET路由转义路由值?

我有一个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编码似乎是错误的.

asp.net-mvc url-routing asp.net-mvc-routing

5
推荐指数
1
解决办法
5015
查看次数

路线始终转到第一个maproute

我正在尝试创建看起来像这样的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)

c# asp.net-mvc routing asp.net-mvc-routing asp.net-mvc-2

5
推荐指数
1
解决办法
1114
查看次数

在区域注册中注册路线

我的区域有两条路线,一条是自定义路线,一条是默认后备路线,见下文

        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 …

asp.net-mvc-routing asp.net-mvc-3

5
推荐指数
1
解决办法
5724
查看次数

如何在RouteTable MVC.Net中手动查找路由?

我在我的一个控制器的动作中有一个String,代表一个引用URL.当前请求的路由数据不是我正在寻找的(因为它是从另一个视图中的脚本标记调用的).

我想找到引用Url的Action和Controller.

我有什么方法可以手动使用像"/ Product/23"这样的字符串来查找控制器并将字符串作为url生成的操作?

asp.net-mvc asp.net-mvc-routing

5
推荐指数
2
解决办法
2645
查看次数

POST上的路由约束错误

在操作中操作数据时,通常会收到一个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)

c# asp.net-mvc asp.net-mvc-routing route-constraint

5
推荐指数
1
解决办法
659
查看次数

将Javascript变量传递给MVC3中的路由值

我想在@ 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)

c# asp.net-mvc asp.net-mvc-routing razor asp.net-mvc-3

5
推荐指数
2
解决办法
7313
查看次数

ASP.NET 4.5和Web API中的URL重写

我们有一个长期运行的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,其中包含一个字典,我可以在其中存储一些页面/请求特定的数据.

asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api

5
推荐指数
1
解决办法
1884
查看次数

无法在mvc 4中映射特定控制器的路由

我有一个名为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

asp.net-mvc routing asp.net-mvc-routing asp.net-mvc-4

5
推荐指数
1
解决办法
3622
查看次数

路由错误访问操作

默认情况下,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)

因此它将显示页面中的所有类别.

然后我注册另一个名为CategoryDe​​tails的地图路线

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操作.它不会转到类别控制器中的创建操作.

我怎么能解决这个问题呢?

c# asp.net-mvc asp.net-mvc-routing

5
推荐指数
1
解决办法
106
查看次数

如何将查询字符串映射到MVC中的操作方法参数?

我有一个网址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属性,我可以申请的操作方法,并可以映射ttaxYearsstate.

但是,我没有为此映射找到Route属性的正确语法,有人可以帮忙吗?

asp.net-mvc asp.net-mvc-routing

5
推荐指数
1
解决办法
5173
查看次数