标签: asp.net-routing

WebApi 2和MVC 5用户使用不同的路由属性吗?

通过阅读博客文章的属性在ASP.NET MVC 5路由和一个属性上的网络API 2路由,它看起来像有两套路由属性,一个在System.Web.Mvc命名空间和其他的System.Web.Http.

  1. 这是对的,有没有人有任何想法(链接),为什么它是这样设计的?
  2. 是应该使用另一个还是它们应该并排生活?

asp.net-routing asp.net-mvc-5 asp.net-web-api2

7
推荐指数
1
解决办法
1603
查看次数

ApiVersion 属性在 .NET 8 中不起作用

我最近将 webapi 升级到 .NET 8。当我测试控制器时,ApiVersion 属性在 swagger 页面中不起作用。

[ApiVersion("1.0")]
[Route("v{version:apiVersion}/api/[controller]")]
[ApiController]
[Authorize]
public class SubscriptionController(ISubscriptionDataService subscriptionDataService, 
                                    IConfigurationService configurationService) : ControllerBase
Run Code Online (Sandbox Code Playgroud)

在 swagger 页面中,默认情况下不会填写版本,就像在 .NET 7 中一样。

在此输入图像描述

以前,使用默认模板weatherforecast 控制器时,行为是默认填充的。

该控制器的代码如图所示。

[ApiVersion("1.0")]
[Route("v{version:apiVersion}/api/[controller]")]
[ApiController]
[Authorize]
public class WeatherForecastController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在 Program.cs 中,添加以下内容以执行版本控制。

private static void AddApiVersioning(IServiceCollection services)
{
    services.AddApiVersioning(options =>
    {
        options.AssumeDefaultVersionWhenUnspecified = false;
        options.ReportApiVersions = false;
    });

    services.AddVersionedApiExplorer(options =>
    {
        options.GroupNameFormat = "'v'VVV";
        options.SubstituteApiVersionInUrl = true;
    });
}
Run Code Online (Sandbox Code Playgroud)

编辑1

由于以下弃用,完成此操作的方式需要更改。

Microsoft.AspNetCore.Mvc.Versioning -> Asp.Versioning.Mvc Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer -> Asp.Versioning.Mvc.ApiExplore

在Program.cs中,需要完成以下操作:

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddApiVersioning(options …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-routing asp.net-core-webapi .net-8.0

7
推荐指数
1
解决办法
2076
查看次数

如何使用ASP.NET路由路由树形结构的URL?

我希望通过一些增强功能实现与此问题非常相似的功能.

有一个ASP.NET MVC Web应用程序.

我有一个实体树.
例如,一个Page具有名为Children的属性的类,它是类型的IList<Page>.(Page类的实例对应于数据库中的行.)

请注意,网站所有者可以随时添加新页面,也可以删除现有页面,并且URL也应反映这些更改.

我想Page为数据库中的每个人分配一个唯一的URL .
Page使用Controller调用对象PageController.

示例网址:

http://mysite.com/Page1/
http://mysite.com/Page1/SubPage/
http://mysite.com/Page/ChildPage/GrandChildPage/
Run Code Online (Sandbox Code Playgroud)

你得到了照片.
所以,我希望每个Page对象都有自己的URL,该URL等于其父URL和自己的名称.
除此之外,我还希望能够将单个映射Page/(根)URL.

我想应用这些规则:

  1. 如果可以使用任何其他路由处理URL,或者指定URL中的文件系统中存在文件,请使用默认URL映射
  2. 如果虚拟路径提供程序可以处理URL,请让它处理它
  3. 如果没有其他URL,则将其他URL映射到PageController该类

我也发现了这个问题,并且也这一个这一个,但他们有很大帮助没有,因为它们不提供有关我的头两个点的说明.

我看到以下可能的消息:

  • 为每个页面静态地映射路线.
    这需要我在应用程序启动时遍历整个树,并在路由表的末尾添加完全匹配路由.
  • 我可以添加一个路由{*path}并编写一个IRouteHandler处理它的自定义,但我看不出我怎么能处理前两个规则,因为这个处理程序将处理所有事情.

到目前为止,第一个解决方案似乎是正确的解决方案,因为它也是最简单的解决方案.但是,即使在那种情况下,我也不确定如何PageController处理请求.

我真的很感激你对此的看法.

先感谢您!

编辑:我现在有时间检查我收到的每个答案的每个方面.我接受了尼尔的回答,因为他是一个提供关于事情如何运作的最佳解释的人.我还提出了所有其他答案,因为它们提供了很好的想法.

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

6
推荐指数
1
解决办法
1404
查看次数

如何在ASP.NET Web表单中将路由重定向到另一个路由?

我有这样的路线:

routes.MapPageRoute("Survey", "Survey", "~/Survey/Survey.aspx")
routes.MapPageRoute("Letters", "About/Letters", "~/Pages/Letters/Letters.aspx")
Run Code Online (Sandbox Code Playgroud)

如何将这样的网址重定向:/调查到"调查"路线?因此,当用户进入/调查时,它会重定向到/ Survey.(为了论证而使用的URL)

如果我不必在ASPX文件本身中放置重定向代码,而不是仅仅在路由规则中包含代码,那么我更喜欢它,只是保持简单和集中.

谢谢

卢克

asp.net webforms asp.net-routing

6
推荐指数
1
解决办法
3381
查看次数

重定向到另一个控制器+操作而不更改ASP.Net MVC3中的URL

注意:下面只是一个小型的演示排序来模拟我要找的东西:

以下是我的应用程序上用户可以看到的网址格式

mydomain.com/cat/1  --display cat with id 1 |controller=Cat, action=DisplayDetails
mydomain.com/dog/2  --display dog with id 2 |controller=Dog, action=DisplayDetails
mydomain.com/cow/2 --display cow with id 3  |controller=Cow, action=DisplayDetails
Run Code Online (Sandbox Code Playgroud)

我维持了一个系统,其中没有2只动物(可能是不同类型的)可以具有相同的id,这意味着如果有一只id = 1的猫,我们不能拥有任何其他具有该id的动物.同样来自我的系统,我可以从动物ID中提取动物细节+类型

除了现有的网址格式,我打算以下面的格式创建一个简短的网址

mydomain.com/1  --this will show cat
mydomain.com/2  --this will show dog
mydomain.com/3  --this will show cow
Run Code Online (Sandbox Code Playgroud)

我创建的路由如下所示,它们在global.asax中显示相同的顺序

pattern= Cat/{id}, controller= Cat, action=DisplayDetails
pattern= Dog/{id}, controller= Dog, action=DisplayDetails
pattern= Cow/{id}, controller= Cow, action=DisplayDetails
pattern= {id}, controller= DisplayAnyAnimal ----------i want help in this Route
Run Code Online (Sandbox Code Playgroud)

目前Controller看起来像这样

public class DisplayAnyAnimalContoller : Controller
{
      public …
Run Code Online (Sandbox Code Playgroud)

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

6
推荐指数
1
解决办法
3782
查看次数

Asp.net MVC/Web Api路由:需要路由一点不同

我使用路由设置了一个asp.net web api项目(它与Mvc项目完全相同) - 因此我有以下内容

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

所以一切都按照我想要的方式工作....我输入api/Products/15它到达我的产品控制器,传入15作为id.

大.

我还有2个控制器,1个叫做UploadsController,1个叫做DownloadController.这些提供上传和下载(GET/PUT等)

现在我不希望他们被原规则接受(见上文)

但我想要的是使用这两个网址来访问它们

/ api/Transport/Uploads/15/api/Transport/Downloads/15

我已经通过了15作为身份证,可能不会发生在现实生活中...只是它有利于示范:-)

现在运输不存在所以我可以做以下事情

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/Transports/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

我认为有效...

但问题是,如果我这样做

/ api/Uploads/15 - 这也会被我不想要的原始规则所捕获..

我希望通过虚假的"传输"访问上传和DOwnloads控制器,而不是没有传输

有人可以帮忙吗?

提前致谢

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

6
推荐指数
1
解决办法
3608
查看次数

ASP.NET MVC:如何强制所有链接转到1页?

我试图找出如何创建路由配置,以便所有URL都将转到相同的VIEW(页面).

当然,如果我这样做的话

/产品/编号

然后,这将在Products控制器中查找.

无论URL是什么,我都想总是转到我的MainController和相同的动作

这可能吗?

提前致谢

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

6
推荐指数
1
解决办法
1749
查看次数

每个控制器使用MVC属性路由多个RoutePrefixes?

使用新的MVC属性路由,我知道您可以Route为单个分配多个属性ActionResult,但我正在寻找在该RoutePrefix级别执行相同操作的方法.我有一个控制器,在每个动作中都应该可以通过三种途径访问:

/Games/{Title}/Characters/{Route} /Books/{Title}/Characters/{Route} /Cinema/{Title}/Characters/{Route}

我尝试了三个单独的RoutePrefix属性,但是我得到了错误Deuplace RoutePrefix attribute.如果我尝试使用以逗号分隔的列表,我会得到Best override method for does not contain a constructor that takes 3 arguments.

是否可以设置一个RoutePrefix所需的三个路径我的控制器?

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

6
推荐指数
1
解决办法
4775
查看次数

在 Razor 页面中获取路由值

我想知道如何在 Razor Pages (Page.cshtml) 中获取路由值。前任。 https://localhost:44320/AdminPanel/Admins 如果我使用 MVC,我会将这些数据作为

var controller = ViewContext.RouteData.Values["Controller"]; //AdminPanel
var action = ViewContext.RouteData.Values["Action"]; //Admins
Run Code Online (Sandbox Code Playgroud)

如何在 Razor Pages 中获取这些值?

对于任何试图获得它的人,您可以通过以下方式获得它:

var fullRoute = ViewContext.RouteData.Values["Page"]; // AdminPanel/Admin
Run Code Online (Sandbox Code Playgroud)

asp.net-routing razor asp.net-core asp.net-core-2.0 razor-pages

6
推荐指数
1
解决办法
5324
查看次数

用加号解码字符串

使用 ASP.NET Core 我收到以下令牌(简化):

String token = "Z%2F3+3Q==";
Run Code Online (Sandbox Code Playgroud)

/是使用编码%2F。我从使用 Angular 在客户端上调用的 URL 收到了令牌。

我尝试使用以下方法解码令牌:

HttpUtility.UrlDecode(token)
Run Code Online (Sandbox Code Playgroud)

或者

WebUtility.UrlDecode(token)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下%2F,都由/我想要的+代替,但由我不想要的空格代替。

我如何解码字符串?

更新

客户端应用程序正在发送编码的令牌:

Z%2F3%2B3Q%3D%3D;
Run Code Online (Sandbox Code Playgroud)

但是,不知何故,似乎令牌在以下操作中:

[HttpPut("account/verify/{userId}/{token}")]
public async Task<IActionResult> VerityEmailAddress([FromRoute]AccountEmailVerifyModel model) {
}
Run Code Online (Sandbox Code Playgroud)

转化为:

Z%2F3+3Q==
Run Code Online (Sandbox Code Playgroud)

所以+=被解码,但/不是。

c# urlencode asp.net-routing asp.net-core asp.net-core-3.1

6
推荐指数
1
解决办法
1765
查看次数