如果我使用Route属性装饰这个web api控制器,我可以点击该方法
[Route("api/v{version}/bank-accounts")]
public class BankAccountsController : ApiController
{
[HttpGet]
public HttpResponseMessage GetBankAccounts()
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我使用RoutePrefix而不能让它工作,除非我同时使用Route("")
[RoutePrefix("api/v{version}/bank-accounts")]
public class BankAccountsController : ApiController
{
[HttpGet]
[Route("")]
public HttpResponseMessage GetBankAccounts()
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这是打算,还是我弄乱了?
谢谢
我在Nuget上使用最新版本的AttributeRouting包来为我的ASP.Net MVC项目设置路由.我正在创建一个有两种语言的网站,英语(主要)和西班牙语(中学).两种语言的网址不同.例如,关于我们的英语将是这样的:www.root.com/en/about-us而西班牙语版本可能就是这样:www.root.com/es/sobre-nosotros.
我有一个Route Prefix设置如下:[RoutePrefix("en",TranslationKey ="Home")]
然后我创建了一个程序,它将XML文件中的值读入FluentTranslationProvider.注册我的路由的代码如下所示:
var translations = new FluentTranslationProvider();
translations
.AddTranslations()
.FromFile();
routes.MapAttributeRoutes(
config =>
{
config.AddRoutesFromControllersOfType<BaseController>();
config.AddTranslationProvider(translations);
config.CurrentUICultureResolver =
(httpContext, routeData) =>
(string) routeData.DataTokens["cultureName"] ??
Thread.CurrentThread.CurrentUICulture.Name;
});
Run Code Online (Sandbox Code Playgroud)
它似乎正在工作,因为我可以访问我的Routes.axd页面并查看以下内容:http://imm.io/nm7Z
稍后在我的页面中,我的代码显示我的CurrentCulture设置为es-AR,但是当我调用URLHelper类来构建url时,它只构建默认的英文版本,并且不会给我西班牙语版本.谁能让我深入了解为什么会出现这种情况?我不能为了这个人的生活而这样做.
asp.net-mvc localization asp.net-mvc-routing attributerouting
传统的路由默认值意味着我们能够访问这些URL并始终以相同的操作结束:
/
/Home
/Home/Index
Run Code Online (Sandbox Code Playgroud)
但今天我们将在这些方面写一些东西:
[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
public ActionResult Index() {}
public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)
但是这种路由定义绝不相同.
/ (fails)
/Home (works)
/Home/Index (works)
Run Code Online (Sandbox Code Playgroud)
因此,如果我们将上层代码更改为
[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
[Route("~/")]
public ActionResult Index() {}
public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)
但随后我们将处理工作颠倒过来:
/ (works)
/Home (fails)
/Home/Index (fails)
Run Code Online (Sandbox Code Playgroud)
我们可以使声明性代码更加冗长,并通过以下方式使其成为旧式路由机制:
[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
[Route("~/")]
[Route("~/Home")]
[Route("~/Home/Index")]
public ActionResult Index() {}
public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)
这适用于所有三种不同的路线.
此问题当然绑定到默认控制器和操作的应用程序默认操作.只是我想知道这是否是唯一的方法呢?有没有更简洁的代码方式让它按预期工作?
@Url.Action根据我申请的属性路线,我无法解析我期望的网址:
我的动作(SearchController,但[RoutePrefix("add")])
[Route("{searchTerm}/page/{page?}", Name = "NamedSearch")]
[Route("~/add")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
...
}
Run Code Online (Sandbox Code Playgroud)
致电Url.Action
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })
Run Code Online (Sandbox Code Playgroud)
这导致了一个网址
/add?searchTerm=replaceMe&page=1
我期待
/add/replaceMe/page/1
如果我手动输入网址,则会使用正确的参数解析为正确的操作.为什么不@Url.Action解析正确的网址?
asp.net-mvc routes url-routing asp.net-mvc-routing attributerouting
我正在测试ASP MVC路由.我在ASP MVC 5.1中遇到属性路由问题
当我有这样的控制器时:
public class FooController : Controller
{
[Route("foo")]
[HttpGet]
public ActionResult Get()
{
....
}
[Route("foo")]
[HttpPost]
public ActionResult Post()
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
然后为了测试哪个路由匹配特定请求,我打电话routes.GetRouteData.我得到一个System.Web.Routing.RouteData包含路由以及应该说明哪个控制器和操作匹配的值.
问题是这个路由现在是RouteCollectionRoute的一个实例,
这个内部类是这两个动作的一组路由的包装器.控制器在RouteData.values,但行动不是.你可以得到这些包含的路线routeData.Values["MS_DirectRouteMatches"] as IList<RouteData>.
在给出的示例中,列表中将有两个路径,用于两个操作方法.我需要知道哪些包含的路由实际匹配,以便我可以读取匹配路由的操作方法名称.我该如何解决这条路线?
我有点不知所措的设计选择RouteCollectionRoute.路由时,您有一个路由集合,然后通过调用解析URL的路由GetRouteData.现在你有一条路线.但如果它是一个RouteCollectionRoute如此仍然是路线的集合和路线解决尚未结束.有一个RouteCollectionRoute获得了什么?路线解决现在是一个两步过程吗?还是一个递归过程?
我知道我正在浏览ASP MVC的内部,但这是唯一的方法,因为它真的没有考虑到这种可测试性.即使是暴露一些内部类或方法等简单的事情也会有很大帮助!
asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5.1
如何使用MVC中的新属性路由创建捕获所有路由
我试过这个:
[Route("{pagenode}", Order = 999)]
但是当我有一条命名路线时
[Route("contact"]
我收到了"Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL."错误.
有谁知道消息处理程序是否可以与Web API 2.x中的属性路由同时工作?我有一个自定义消息处理程序使用传统路由工作,然后添加属性路由后,它停止工作.我不确定它是否不受支持,或者我是否配置错误.任何帮助是极大的赞赏.
1)在属性路由之前
--- WebApiConfig.cs code snippet (simplified)----
config.Routes.MapHttpRoute(
name:"DefaultApi",
routeTemplate: "api/{controller}",
defaults: null,
constraints: null,
handler: my-message-handler-object
);
--- MyController.cs code snippet (simplified)----
public class MyController : ApiController
{
[HttpGet]
public IHttpActionResult CheckInServices(...)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
2)属性路由后
--- WebApiConfig.cs code snippet (simplified)----
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name:"DefaultApi",
routeTemplate:"api/vendor",
defaults: new { controller = "Users" },
constraints: null,
handler: my-message-handler-object
);
}
--- MyController.cs code snippet (simplified)----
[RoutePrefix("api/vendor/{vendorID:long}/service")]
public class …Run Code Online (Sandbox Code Playgroud) 如何在我看来从web api获取网址?
示例(来自msdn-blog):
[RoutePrefix("reviews")]
public class ReviewsController : ApiController
{
// eg.: /reviews
[Route]
public IHttpActionResult Get() { ... }
// eg.: /reviews/5
[Route("{reviewId}")]
public IHttpActionResult Show(int reviewId) { ... }
// eg.: /reviews/5/edit
[Route("{reviewId}/edit")]
public IHttpActionResult Edit(int reviewId) { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在我想在我的视图中构建"/ reviews/edit",我该怎么做?
我尝试创建一个小扩展方法,但它要求我给每个路由一个实际的"RouteName".有没有我可以使用的方法(比如在MVC中)我可以通过控制器和动作?
@Url.Action("Edit", "Reviews)
Run Code Online (Sandbox Code Playgroud)
我现在使用的方法(使用RouteName)也不允许我使用整数作为参数(除非我传递一个默认值).如果我确实需要命名我的所有路由,我如何创建路由URL,但是在我的请求的"数据"部分中传递我的参数?
目前的方法:
public static string ResolveWebApiRoute(this UrlHelper urlHelper, string routeName, object routeValues = null)
{
var newRouteValues = new RouteValueDictionary(routeValues);
newRouteValues.Add("httproute", true);
return urlHelper.RouteUrl(routeName, newRouteValues);
}
Run Code Online (Sandbox Code Playgroud)
编辑
当我使用类似的方法时Url.RouteUrl(new { …
我试图在使用属性路由的控制器上获取ActionDescriptor,但它始终为null.
var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
var actionDescriptor =
controllerDescriptor.FindAction(controllerContext, actionName) ??
controllerDescriptor.GetCanonicalActions().FirstOrDefault(a => a.ActionName == actionName);
Run Code Online (Sandbox Code Playgroud)
从我的研究中,我发现在ActionMethodSelectorBase类中有一个名为PopulateLookupTables的方法,它将你给它的控制器中的所有方法分开.在其中的方法中,它将MethodInfo的列表过滤为2组列表.
注意:如果在控制器级别设置了直接路由(RouteAttribute),则AliasedMethods和NonAliasedMethods将为空.
注意:直接路由被定义为控制器中的方法(不包括构造函数和事件),并使用从IRouteInfoProvider或IDirectRouteFactory继承的属性进行修饰(RouteAttribute继承自这两者).
和
当ReflectedControllerDescriptor.FindAction被调用,它在内部调用ActionMethodSelectorBase.FindActionMethods只着眼于AliasedMethods和NonAliasedMethods(其中不包括与直连路由的所有操作).
当ReflectedControllerDescriptor.GetCanonicalActions被调用,它在内部调用ReflectedControllerDescriptor.GetAllActionMethodsFromSelector只着眼于AliasedMethods和NonAliasedMethods(其中exlude与直连路由的所有操作).
从我所看到的,DirectRouteMethods仅在一个地方使用,即RouteCollection.MapMvcAttributeRoutes扩展方法.这意味着RouteTable.Routes集合有一个RouteCollectionRoute到操作但我不知道如何到达它.
有没有人知道如何为具有RouteAttribute的操作获取ActionDescriptor
c# asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5
使用属性路由时,可以通过添加问号(?)来获取可选参数.但它对我不起作用(ASP.NET Web API 5).
[Route("staff/{featureID?}")]
public List<string> GetStaff(int? featureID) {
List<string> staff = null;
return staff;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用staff/1等它工作正常,如果我使用/staff我得到通常:
"没有找到与请求URI匹配的HTTP资源......"
"在控制器上找不到与请求匹配的操作."
我错过了参考或其他什么?或者做错了?