标签: asp.net-mvc-routing

在过滤器属性中获取区域、控制器和动作名称

我有全局属性,我需要知道区域、控制器和动作。由于路由(区域内注册和属性路由),我无法使用 RawUrl。我遵循了以下两种方法,但在这两种情况下,我的区域都返回空值。当我使用路线时,我得到的区域名称就好了。当我执行重定向操作或 url.action 或手动输入 url 等时,为什么我的区域为空?我们正在使用 MVC 5.0。

1:

var routingValues = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current)).Values;

                        var currentArea = (string) routingValues["area"] ?? string.Empty;
                        var currentController = (string) routingValues["controller"] ?? string.Empty;
                        var currentAction = (string) routingValues["action"] ?? string.Empty;
Run Code Online (Sandbox Code Playgroud)

2:

var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler;
                            var area = handler.RequestContext.RouteData.Values["area"];
                            var controller = handler.RequestContext.RouteData.Values["controller"];
                            var action = handler.RequestContext.RouteData.Values["action"];
Run Code Online (Sandbox Code Playgroud)

就像我上面说的,如果我使用路线(/TipHotLine),那么我就可以很好地获得区域名称。

public class AgencyAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Agency";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Agency_default", …
Run Code Online (Sandbox Code Playgroud)

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

4
推荐指数
1
解决办法
4818
查看次数

是否可以在 url 中的操作之前定义参数

问题和标题一样简单。

是否有可能有一条看起来像这样的路线:{controller}/{id}/{action}

这就是我现在的代码(只是一个简单的函数)(device是我的控制器):

[HttpGet]
[Route("Device/{id}/IsValid")]
public bool IsValid(int id) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是当我转到以下 URL 时,浏览器说它找不到该页面:localhost/device/2/IsValid

当我尝试这个 URL 时,它工作得很好: localhost/device/IsValid/2

那么,是否可以使用localhost/device/2/IsValid代替默认路由localhost/device/IsValid/2?以及如何做到这一点?

随时询问更多信息!提前致谢!

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

4
推荐指数
1
解决办法
915
查看次数

MVC5 路由命名空间优先级

在 MVC5 路由中,我需要一种情况。我有 2 个具有相同控制器名称的命名空间。我想在没有冲突的情况下在控制器之间动态选择

routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Namespace1","Namespace2" });
Run Code Online (Sandbox Code Playgroud)

在这里,如果在两个命名空间下有 2 个具有相同名称和操作的控制器,则会出现冲突错误。我想做的是优先考虑命名空间。

如果两个命名空间都有 Home.Index 操作,我希望 Namespace1 带头而不是错误。如果namespace1 没有我希望系统检查Namespace2 的操作。

我尝试了几种方法,但我不想使用属性路由更好的架构。

我们有一个 BaseECommerce asp.net mvc 项目和继承 BaseEcommerce 项目的 UI 项目。目的是如果 UI 项目中有相同的 Controller 和 Action 使用它。否则使用基础项目。

感谢帮助。

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

4
推荐指数
1
解决办法
2062
查看次数

在处理请求之前从请求中删除查询字符串

我想删除一个特定的查询字符串(即fbclid),Facebook 将其添加到共享链接中以进行跟踪(我假设)。我需要对所有工作路线执行此操作,但我找不到简单的解决方案。

我正在使用 ASP.NET Core 2.0、AWS lambda、API 网关。

我尝试使用重写器,但当替换为空字符串时,它会引发异常。这是我的代码:

app.UseRewriter(new RewriteOptions()
    .AddRewrite("\\?fbclid=(\\w*)", string.Empty, false));
Run Code Online (Sandbox Code Playgroud)

我不想重定向到干净的 URL 或获取没有查询参数的 URL。相反,我需要更改管道其余部分的当前请求以正确处理它。

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

4
推荐指数
1
解决办法
2502
查看次数

如何从 ASP.NET Core 3 属性路由中排除控制器

我的 Web API 使用 ASP.NET Core 3.1。我有多个控制器都使用基于属性的路由,一切都很好。

我们希望能够在应用程序配置中切换一个或多个带有功能标志的控制器。理想情况下,如果未设置标志,则相应的控制器在 API 眼中应该不复存在。我正在努力想出最好的(或任何)方法来做到这一点。

在使用属性路由时,似乎没有配置扫描哪些控制器的内置方法,也无法修改路由找到的控制器或端点的集合。这是有问题的 Startup.cs 片段:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {            
        app.UseRouting();
        app.UseEndpoints(e =>
        {
            if (!this.FeatureEnabled)
            {
                // DO SOMETHING?
            }

            e.MapControllers();
        });
    }
Run Code Online (Sandbox Code Playgroud)

我意识到我可以切换到更手动的手写路由并在 Startup 类中指定每个控制器、动作和参数,但我宁愿放弃这个功能标志要求,也不愿走那条凌乱的道路。

使用基于属性的路由时,有什么方法可以选择 API 中使用哪些控制器?

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

4
推荐指数
3
解决办法
4802
查看次数

asp.NET:未知长度的MVC路径

我正在asp.NET中为Web门户构建MVC应用程序.我准备了一系列控制器,并将所有不与之对应的路径映射到Page控制器,这将呈现适当的页面.

我的默认路由如下:

routes.MapRoute(
  "Default",
  "{level1}/{level2}/{level3}",
  new { controller = "Page", action = "Index", level1 = "home", level2 = "", level3 = "" }
      );
Run Code Online (Sandbox Code Playgroud)

但这有固定的宽度,它只接受最多3个级别.此外,我想管理附加到路径的操作,例如"编辑"和"删除".这可能吗?

company/about/who_we_are/staff -> Controller: Page, Action: Index, Parms: company/about/who_we_are/staff
company/about/who_we_are/staff/edit  -> Controller: Page, Action: Edit, Parms: company/about/who_we_are/staff
company/edit  -> Controller: Page, Action: Edit, Parms: company
Run Code Online (Sandbox Code Playgroud)

或者有更好的方法对此进行建模吗?页面的所有路径都在数据库中,因此它们会动态更改.

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

3
推荐指数
1
解决办法
838
查看次数

MVC Handler用于未知数量的可选参数

我正在使用MVC路由,它将在URL的末尾获取未知数量的参数.像这样的东西:

domain.com/category/keyword1/keyword2/.../keywordN

这些关键字是我们必须匹配的过滤器的值.

到目前为止,我能想到的唯一方法是UGLY ......只需创建一个ActionResult,其参数多于我可能需要的参数:

ActionResult CategoryPage(string urlValue1,string urlValue2,string urlValue3等...){}

这感觉不对劲.我想我可以将它们塞进一个查询字符串中,但后来我丢失了性感的MVC URL,对吧?有没有更好的方法来声明处理程序方法,以便它处理未知数量的可选参数?

必须在Application Start上连接路由,这应该不是那么难.关键字的最大数量可以很容易地从数据库中确定,因此没有大问题.

谢谢!

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

3
推荐指数
1
解决办法
1618
查看次数

.Net MVC路由未确定的文件夹数(嵌套类别结构)

我正在探索将MVC用于我的下一个电子商务网站的可能性.我似乎无法弄清楚的一件事是我是否可以使用我通常使用的相同URL约定.目前,任何产品的URL可以是以下之一:

  • 类别/子/ Product1.html
  • 类别/子/ SubSubCategory/Product2.html
  • 类别/子/ SubSubCategory/Product3.html
  • 类别/子/ SubSubCategory/SubSubSubCategory/Product4.html

等等

我遇到的问题是嵌套的类别结构.到目前为止,我唯一想到的是如下:

routes.MapRoute(
    "Products",
    "{categories}/{productname}",
    new { controller = "Product", action = "Details", productname = UrlParameter.Optional },
    new { categories = @"\w+/\w+" }
);
Run Code Online (Sandbox Code Playgroud)

我希望{categories}可以与以下任何一个匹配,我可以处理这些以确定产品所属的正确类别:

  • 运动/网球/ 球拍 /产品A.
  • 运动/羽毛球/ 球拍 /产品B.

但是上面显示的路线无法正常工作.

有谁知道如何实现这一目标,或者是否无法实现?

regex asp.net-mvc constraints asp.net-mvc-routing

3
推荐指数
1
解决办法
1644
查看次数

找到了与请求匹配的多个操作

我已经阅读了很多关于路由和控制器的问题,但我根本无法找到我正在寻找的东西.我有这个结构的控制器:

更新:包含完整的类源.

public class LocationsController : ApiController
{
    private readonly IUnitOfWork _unitOfWork;

    public LocationsController(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    // GET /api/locations/id
    public Location Get(Guid id)
    {
        return this.QueryById<Location>(id, _unitOfWork);
    }

    // GET /api/locations
    public IQueryable<Location> Get()
    {
        return this.Query<Location>(_unitOfWork);
    }

    // POST /api/locations
    public HttpResponseMessage Post(Location location)
    {
        var id = _unitOfWork.CurrentSession.Save(location);
        _unitOfWork.Commit();

        var response = Request.CreateResponse<Location>(HttpStatusCode.Created, location);
        response.Headers.Location = new Uri(Request.RequestUri, Url.Route(null, new { id }));

        return response;
    }

    // PUT /api/locations
    public Location Put(Location location) …
Run Code Online (Sandbox Code Playgroud)

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

3
推荐指数
1
解决办法
7403
查看次数

C#ASP .Net MVC 4可变长度路由映射

我需要在asp.net mvc 3中进行可变长度路由映射.根据我的理解,我可以映射这样的路由:

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
Run Code Online (Sandbox Code Playgroud)

但是如何添加可变数量的参数.我的应用程序中的路由具有从基本地址开始的目录结构,如下所示:www.mywebsite.com/root/

root后面跟的东西有一个像这样的目录结构:

www.mywebsite.com/root/directory1/directory2/image.jpg

这将对应于这样的映射:

routes.MapRoute(
            "Default", // Route name
            "root/{path}", // URL with parameters
            new { controller = "DirectoryBrowser", action = "Browse" } );
Run Code Online (Sandbox Code Playgroud)

但我不知道如何设置路径参数.

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

3
推荐指数
1
解决办法
916
查看次数