我的问题很简单。我有一个 Uri,我想弄清楚它映射到哪条路由,以便我可以对路由的各个部分进行一些检查:控制器、动作等。
如何从 Uri 转到 RouteData 或 Route?
我有一个这样定义的动作:
public ActionResult Foo(int[] bar) { ... }
Run Code Online (Sandbox Code Playgroud)
像这样的网址将按预期工作:
.../Controller/Foo?bar=1&bar=3&bar=5
Run Code Online (Sandbox Code Playgroud)
我有另一个动作可以做一些工作,然后重定向到Foo上面的动作以获得bar.
是否有一种使用 RedirectToAction 或 ActionLink 指定路由值的简单方法,以便像上面的示例一样生成 url?
这些似乎不起作用:
return RedirectToAction("Foo", new { bar = new[] { 1, 3, 5 } });
return RedirectToAction("Foo", new[] { 1, 3, 5 });
<%= Html.ActionLink("Foo", "Foo", new { bar = new[] { 1, 3, 5 } }) %>
<%= Html.ActionLink("Foo", "Foo", new[] { 1, 3, 5 }) %>
Run Code Online (Sandbox Code Playgroud)
但是,对于数组中的单个项目,这些确实有效:
return RedirectToAction("Foo", new { bar = 1 });
<%= Html.ActionLink("Foo", "Foo", …Run Code Online (Sandbox Code Playgroud) asp.net-mvc url-routing redirecttoaction actionlink asp.net-mvc-routing
我传递了一个参数列表。如“名称”、“ID”、“类型”。url 中会有很多这样的内容,如下所示:
"Name=blah1,Id=231,Type=blah1;Name=blah2,Id=2221,Type=blah1;Name=blah3,Id=45411,Type=blah3;"
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法将这些查询参数映射到对象列表。所以,我可以创建一个对象:
MyTestObject {Name;Id;Type} 并且可以在我的控制器中说
Index(IList<MyTestObject> params)
Run Code Online (Sandbox Code Playgroud)
params 将填充来自查询字符串的数据。
类似于http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx 的东西
我有一个我试图用相对简单的代码创建的表单:
@using (Ajax.BeginRouteForm("DefaultApi", new { controller = "persons" }, new AjaxOptions {HttpMethod = "post", OnSuccess = "someSuccess"}))}
{
@Html.TextBoxFor(m => m.Name)
}
Run Code Online (Sandbox Code Playgroud)
我有一个 PersonsController,它是一个 ApiController,我在 WebApiConfig 中有以下路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
但是 BeginRouteForm 调用不返回任何操作。生成的 HTML:
<form action="" data-ajax="true" data-ajax-method="post" data-ajax-success="someSuccess" id="form0" method="post">
</form>
Run Code Online (Sandbox Code Playgroud)
如您所见,该操作为空。它不是在抱怨它找不到路线(如果它找不到,它会抱怨),那么发生了什么?我什至尝试在 routeValues 对象中提供一个空的 id,但这也不起作用(尽管它不应该是必需的,因为 id 是可选的)。
我在这里缺少什么?您不能将 BeginRouteForm 与通过 MapHttpRoute 添加的路由一起使用吗?行为与 Html.BeginRouteForm 和 Ajax.BeginRouteForm 相同(它们应该具有相同的基础)。显然,在这种情况下,我希望该操作返回 '/api/persons'。
c# asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing
我想从 mvc 视图到 WebApi 控制器以及从 WebApi 到 MVC 操作生成 url。通常这些方法工作得很好:
// mvc to webapi
@Url.HttpRouteUrl("DefaultApi", new { controller = "Test" })
// webapi to mvc
Url.Link("Default", new { controller = "Home" }
Run Code Online (Sandbox Code Playgroud)
将 WebApi 移动到 OWIN 主机后,这些方法会抛出异常,因为 Mvc 和 WebApi 看不到彼此的路由。
System.ArgumentException: A route named 'DefaultApi' could not be found in the route collection.
Parameter name: name
at System.Web.Routing.RouteCollection.GetVirtualPath(RequestContext requestContext, String name, RouteValueDictionary values)
...
Run Code Online (Sandbox Code Playgroud)
当使用 OWIN 主机配置 WebApi 时,如何生成这些链接?
更新:我的启动配置:
public void ConfigureWebApi(IAppBuilder app)
{
var config = …Run Code Online (Sandbox Code Playgroud) asp.net-mvc asp.net-mvc-routing asp.net-web-api asp.net-web-api-routing owin
我希望能够将我的 URL 重写为单级 URL。这意味着我需要制定一个动态的(将在每种语言中改变)重写规则,如下所示:
原始网址:http : //www.mydomain.com/account/pages/13
我总是想在单个级别中显示 URL:
http://www.mydomain.com/my-page-title
域名后不得超过一个斜杠 / 。
我还需要能够翻译上面示例中的页面标题:
http://www.mydomain.com/my-translated-page
我如何实现这一点,它应该能够在运行时改变这一点——即“改进”url,就像在 htaccess 中重写规则一样
页面加载后,我在从 MiniProfiler 获取 POST 结果时遇到了一些问题。
我试过 GET,它的工作原理。但是 POST 返回 404 错误,就好像它在寻找静态文件一样。

任何有关我下一步可以尝试的帮助或提示将不胜感激。
这是我到目前为止所看到的:
这不是我的路线
GET/POST 问题会让我怀疑我的路线有问题 - 除了......
此问题仅发生在实时服务器上。在本地,路由运行良好。
可能是:runAllManagedModulesForAllRequest?
我读过的大部分内容都建议将其设置为 true。然而,我的问题似乎与此相矛盾。
runAllManagedModulesForAllRequest="true"设置为 true时出现问题,设置为 false 时修复。我想将它设置为 true ,因为我的知识不够丰富,无法从默认设置中更改它。
添加处理程序没有帮助
其他资源,比如这个(在 MP 主页的底部),建议将此行添加到 web.config 中的 system.webServer.handlers。
据我了解,即使 runAllManagedModulesForAllRequests 设置为 false,这也应该允许 MP 运行。对我来说,这两种方式都没有影响。
<add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
Run Code Online (Sandbox Code Playgroud)
但是 Web.Config 中的处理程序部分是否相关?
我没有特别的理由认为这是...
我只是不完全理解它在做什么,想知道这是否可以解释本地版本和部署版本之间的差异。
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." …Run Code Online (Sandbox Code Playgroud) web-config asp.net-mvc-routing http-status-code-404 mvc-mini-profiler
该RouteAttribute("abc", Order = 2)排序仅似乎在控制器内推崇:当在同一个控制器定义以下方法,我得到预期的行为,即Method1优先级,Method2则永远不会调用。
[Route("abc", Order = 1)]
public ActionResult Method1() { ... }
[Route("abc", Order = 2)]
public ActionResult Method2() { ... }
Run Code Online (Sandbox Code Playgroud)
如果我在两个单独的控制器中定义这些方法,我会得到一个不明确的路由异常: InvalidOperationException: Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL.
是否可以使用属性路由定义跨控制器的顺序?
编辑 1:当分布在多个控制器上时,似乎即使在一个控制器内具有隐式排序的路由也是模棱两可的。以下在一个控制器中是可以的(通配符之前的文字),但如果放入不同的控制器中会引发异常。
[Route("details/abc")]
[Route("details/{product}")]
Run Code Online (Sandbox Code Playgroud)
这让我认为它是设计使控制器保持专注并强制在同一控制器中定义类似的路由。
编辑2:
这些是我真正想要使用的路线。我想把它们放到不同的控制器中,因为它们做不同的事情。它们的区别在于前缀。
[Route("reactive/monitor")]
[Route("{tier}/monitor")]
Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc asp.net-mvc-routing routeattribute asp.net-mvc-5
来自www:
...路由引擎将采用与提供的URL匹配的第一个路由,并尝试使用该路由中的路由值.因此,应首先在表中添加不太常见或更专业的路由,而稍后应添加更一般的路由......
我为什么要先绘制专业路线?有人可以举个例子,我可以看到"地图常见路线优先"的失败吗?
asp.net-mvc url-routing asp.net-mvc-routing asp.net-mvc-5 asp.net-mvc-5.2
在我以前的.net应用程序中,我以前在route.config中使用以下路由
routes.MapRoute(
name: "Default",
url: "{tenant}/{controller}/{action}/{id}",
defaults: new { tenant = "GRE", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
现在,我将移至.Net Core,但由于某种原因,我无法在startup.cs中设置类似的路由
我已经尝试过以下方法,但从未成功。
app.UseMvc(routes =>
{
routes.MapRoute("testroute", "{tenant}/{controller}/{action}/{id}",
defaults: new { tenant = "GRE", controller = "Home", action = "Index" });
});
Run Code Online (Sandbox Code Playgroud)
HomeController.cs
public IActionResult Index(string tenant)
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
赞赏各种帮助或提示使其工作
谢谢,
c# asp.net-mvc asp.net-mvc-routing asp.net-core visual-studio-2017
asp.net-mvc ×7
c# ×3
url-routing ×3
actionlink ×1
asp.net-core ×1
owin ×1
rest ×1
routing ×1
seo ×1
web-config ×1