标签: attributerouting

在.net web api属性路由中的控制器级别使用Route而不是RoutePrefix

如果我使用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)

这是打算,还是我弄乱了?

谢谢

c# asp.net-web-api attributerouting

13
推荐指数
2
解决办法
9817
查看次数

属性路由和本地化的问题

我在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

12
推荐指数
1
解决办法
1041
查看次数

MVC 5中的属性路由和可选的默认值

传统的路由默认值意味着我们能够访问这些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)

这适用于所有三种不同的路线.

此问题当然绑定到默认控制器和操作的应用程序默认操作.只是我想知道这是否是唯一的方法呢?有没有更简洁的代码方式让它按预期工作?

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

12
推荐指数
1
解决办法
6129
查看次数

使用Url.Action的MVC属性路由不解析路由

@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

12
推荐指数
2
解决办法
6791
查看次数

如何在RouteCollectionRoute中找到正确的路线?

我正在测试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

11
推荐指数
1
解决办法
1312
查看次数

MVC 5 AttributeRouting Catch All

如何使用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."错误.

attributerouting asp.net-mvc-5

10
推荐指数
2
解决办法
6010
查看次数

web api - 消息处理程序属性路由

有谁知道消息处理程序是否可以与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)

asp.net-web-api attributerouting message-handlers

10
推荐指数
1
解决办法
1321
查看次数

使用属性路由为Web Api构建URL视图

如何在我看来从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 { …

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

9
推荐指数
1
解决办法
1万
查看次数

使用属性路由时如何获得Mvc 5 Controller的ActionDescriptor?

我试图在使用属性路由的控制器上获取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组列表.

  • AliasedMethods - 没有使用ActionNameSelectorAttribute修饰的直接路由的所有操作方法.
  • NonAliasedMethods - 没有未使用ActionNameSelectorAttribute修饰的直接路由的所有操作方法.

注意:如果在控制器级别设置了直接路由(RouteAttribute),则AliasedMethods和NonAliasedMethods将为空.

注意:直接路由被定义为控制器中的方法(不包括构造函数和事件),并使用从IRouteInfoProvider或IDirectRouteFactory继承的属性进行修饰(RouteAttribute继承自这两者).

  • DirectRouteMethods - 使用某种形式的IRouteInfoProvider直接装饰它们的方法.
  • StandardRouteMethods - 没有IRouteInfoProvider直接装饰它们的方法.(包括具有RouteAttribute的控制器中的操作方法,但该方法没有RouteAttribute).

ReflectedControllerDescriptor.FindAction被调用,它在内部调用ActionMethodSelectorBase.FindActionMethods只着眼于AliasedMethodsNonAliasedMethods(其中不包括与直连路由的所有操作).

ReflectedControllerDescriptor.GetCanonicalActions被调用,它在内部调用ReflectedControllerDescriptor.GetAllActionMethodsFromSelector只着眼于AliasedMethodsNonAliasedMethods(其中exlude与直连路由的所有操作).

从我所看到的,DirectRouteMethods仅在一个地方使用,即RouteCollection.MapMvcAttributeRoutes扩展方法.这意味着RouteTable.Routes集合有一个RouteCollectionRoute到操作但我不知道如何到达它.

有没有人知道如何为具有RouteAttribute的操作获取ActionDescriptor

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

9
推荐指数
1
解决办法
2402
查看次数

属性路由 - 可选参数不起作用?

根据http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#optionals-and-defaults

使用属性路由时,可以通过添加问号(?)来获取可选参数.但它对我不起作用(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资源......"

"在控制器上找不到与请求匹配的操作."

我错过了参考或其他什么?或者做错了?

asp.net-web-api attributerouting

9
推荐指数
3
解决办法
5533
查看次数