标签: attributerouting

尝试使用AttributeRouting创建默认的ASP.NET MVC路由

我刚开始在ASP.NET MVC3应用程序中使用AttributeRouting.我开始使用-no-控制器.(新空MVC3应用程序)

然后我做了一个区域.(称为:Documentation)

然后我添加了一个控制器(称为:DocumentationController)

我这样做了..

[RouteArea("Documentation")]
public class DocumentationController : Controller
{
    [GET("Index")]
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下路线,有效: /documentation/index

但我怎样才能使这两条路线起作用呢?

1 - /< - (默认路由/未指定特定路由)2 - /documentation< - no'index'添加了子路由部分.

可以使用AttributeRouting完成吗?

更新:

我知道如何使用默认的ASP.NET MVC3结构等来做这件事.我想要做的是通过AttributeRouting来解决这个问题.

.net c# asp.net-mvc routes attributerouting

5
推荐指数
1
解决办法
1499
查看次数

405使用AttributeRouting.PUTAttribute时除非我还包含HttpPutAttribute

我有一个MVC项目,我试图更新以包括WebApi.为了获得所需的路由,我们使用AttributeRouting.除了返回405的[PUT]之外,所有调用似乎都正确路由.我已经简化了控制器和操作,并且仍然使用[PUT]接收错误,除非我也包含[HttpPut].不确定我错过了什么.

    [RoutePrefix("api/Sites")]
    public class SitesController : BaseApiController
    {
        [POST("")]
        public bool CreateSite(SiteSignupArgs args)
        {
            ...
        }

        [GET("Statuses")]
        public IList<SiteAuditViewModel> GetStatuses()
        {
            ...
        }

        [PUT("Statuses/{siteId}")]
        [HttpPut] // This is required or 405 is returned 
        public HttpResponseMessage UpdateStatus(string siteId, UpdateStatusArgs args)
        {
            ...
        }

        [DELETE("Statuses/{siteId}")]
        public HttpResponseMessage Delete(string siteId)
        {
            return Request.CreateResponse(HttpStatusCode.OK);
        }
}
Run Code Online (Sandbox Code Playgroud)

AttributeRouting.Core 3.5.6版,AttributeRouting.Core.Http,AttributeRouting.Core.Web,AttributeRouting.WebApi

MVC4

未安装WebDAV.

asp.net-web-api attributerouting

5
推荐指数
1
解决办法
2156
查看次数

使用HttpClient使用AttributeRouting在URL中发送日期

我在获取WebAPI接受的日期范围查询时遇到了一些问题.据我所知,我所读到的一切应该可行,但我仍然得到400 Bad Request回应.

我的API路线如下所示:

    [System.Web.Http.HttpGet]
    [GET("range/{start:datetime}/{end:datetime}")]
    public HttpResponseMessage Get(DateTime start, DateTime end)
Run Code Online (Sandbox Code Playgroud)

我正在使用该AttributeRouting库,根据此页面,我要求的URL应该没问题.

我的请求网址如下所示:

http://localhost:51258/plots/range/2013-07-29T21:58:39/2013-08-05T21:58:39
Run Code Online (Sandbox Code Playgroud)

我在控制器上有这个设置,RoutePrefix("plots")这是plotsURL路由的位来自.

如果我把时间从DateTime物体上移开,一切正常,但我需要时间过去.

c# datetime asp.net-web-api attributerouting

5
推荐指数
1
解决办法
5060
查看次数

将属性路由限制为特定的HTTP动词

使用AttributeRouting库,我可以将路由限制为特定的动词:

[Route("customers", HttpVerbs.Post)]
Run Code Online (Sandbox Code Playgroud)

在MVC 5中,内置了AttributeRouting,但是使用HttpVerbs时没有重载。在这种情况下,如何限制到POST的路由?

attributerouting asp.net-mvc-5

5
推荐指数
1
解决办法
701
查看次数

OWIN无法使用webapp.start隔离运行多个应用程序

当我尝试在不同的URL上启动两个应用程序时,我遇到了属性路由中间件的问题.如果我在单独的应用程序中有两个类似的路由,但使用不同的http方法web.api似乎只找到其中​​一种方法.

Microsoft.Owin.Hosting.WebApp.Start<Admin.Startup>("http://localhost:1000");
Microsoft.Owin.Hosting.WebApp.Start<Startup>("http://localhost:1001");
Run Code Online (Sandbox Code Playgroud)

如何隔离这两个应用程序,以便属性路由不冲突?

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

5
推荐指数
1
解决办法
2018
查看次数

有什么方法可以覆盖action方法的属性而不必覆盖整个方法?

我在MVC 5中使用属性路由,但我开始注意到一点痛点.我有一种情况,我想继承控制器,因为所有的动作都会做同样的事情.但是,我显然需要为子类的操作使用不同的路由.现在,我正在做类似于:

public class FooController : Controller
{
    [Route("foo", Name = "Foo")]
    public virtual ActionResult Foo()
    {
        ...

        return View();
    }
}

public class BarController : FooController
{
    [Route("bar", Name = "Bar")]
    public override ActionResult Foo()
    {
        return base.Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很糟糕.我不是重复实际操作方法的代码(在某些情况下是相当多的),至少,但这对我来说感觉不对.此外,在基本操作方法定义由于某种原因而发生变化的情况下,这会成为一种维护噩梦.通常,我是否有某些方法可以在不必覆盖方法的情况下更改属性?也许,某些属性特定于路由.或者我只是运气不好?

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

5
推荐指数
1
解决办法
1125
查看次数

MVC 5属性路由的性能不佳和网站速度慢

我正在使用mvc5在Azure上开发一个网站.我使用属性路由,在控制器上使用路由和路由前缀.我用action.link助手打电话.我没有说出我的路线.

我在route.config上做了以下事情:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.LowercaseUrls = true;
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

我的控制器就像:

[OutputCache(Duration = 600, Location = System.Web.UI.OutputCacheLocation.Client)]
[RoutePrefix("istanbul/kadikoy")]
[Route("{action=index}")]
public class KadikoyController : Controller
{

    public ActionResult Index()
    {
        return View();
    }

    [Route("kadikoy-tarihi")]
    public ActionResult KadikoyTarihi()
Run Code Online (Sandbox Code Playgroud)

我的服务器响应时间非常差,即9.6秒

如果我注释掉属性路由代码,使用默认路由,我有2.1秒的服务器响应时间.

谢谢您的回复.

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

5
推荐指数
1
解决办法
949
查看次数

如何在asp.net mvc中以编程方式确定Route Prefix?

我想为管理/身份验证的控制器和视图中的公共/匿名控制器和视图提供一些URL分隔.所以我最终完全使用属性路由,以便更好地控制我的URL.我希望我的公共URL以"〜/ Admin/etc"开头.而我的公共网址没有任何这样的前缀.

公共控制员(几个中的一个)

[RoutePrefix("Home")]
public class HomeController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    { //etc. }
}
Run Code Online (Sandbox Code Playgroud)

管理员控制器(几个之一)

[RoutePrefix("Admin/People")]
public class PeopleController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    { //etc. }
}
Run Code Online (Sandbox Code Playgroud)

这允许我拥有公共URL,例如:

http://myapp/home/someaction
Run Code Online (Sandbox Code Playgroud)

...以及admin/authenticated URL,例如:

http://myapp/admin/people/someaction
Run Code Online (Sandbox Code Playgroud)

但是现在我想根据用户是在网站的"管理"部分还是"公共"部分,在视图中做一些动态的东西.如何正确地以编程方式访问?

我知道我可以做点什么

if (Request.Url.LocalPath.StartsWith("/Admin"))
Run Code Online (Sandbox Code Playgroud)

......但感觉"很丑".我知道我可以通过访问控制器和动作名称

HttpContext.Current.Request.RequestContext.RouteData.Values
Run Code Online (Sandbox Code Playgroud)

...但是"admin"部分没有反映在那里,因为它只是一个路由前缀,而不是一个实际的控制器名称.

所以,基本的问题是,如何以编程方式确定当前加载的视图是否在"admin"部分下?

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

5
推荐指数
1
解决办法
6635
查看次数

Asp.Net MVC5 - Html.Action - 属性路由 - 导致异常的奇怪行为

以下是我整个网站中不同操作和视图的一些奇怪行为:

每当我POST一些动作方法并且Model.IsValid为false时,我都会返回视图.每当在返回的视图中调用Html.Action()时,我都会遇到以下异常:

(System.Web.HttpException): No matching action was found on controller 'xyz'. 

This can happen when a controller uses RouteAttribute for routing, 
but no action on that controller matches the request.
Run Code Online (Sandbox Code Playgroud)

我正在使用属性路由.

public class RouteConfig
{
    // REGISTER ROUTES

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapMvcAttributeRoutes();        
    }     
}
Run Code Online (Sandbox Code Playgroud)

因此,即使Html.Action调用第一次在GET操作方法中返回View(),Html.Action总是在POST返回View()之后抛出此异常.这是我网站上的一般模式.

跆拳道?有什么想法在这里出了什么问题?我唯一能想到的是我随着时间的推移添加了更多的路线,现在它很困惑.如果是这样的话,我该如何修复或测试?

我刚想到我有很多路由/动作方法,其中动作方法的路径的get和post版本是相同的,除了action方法的GET或POST属性.我以前确定每条路线都是完全独特的,因为我得到了一些歧义,但是将其改回了相同的路线,用于获取和后置动作方法,唯一的区别是get或post属性......我变得确信它是路由问题,但我不知道具体是什么问题.我有数百种动作方法的路由属性.

我以前从未见过如此微妙的东西,甚至不知道如何开始解决这样的问题.我不知道它是简单还是复杂,如果它是我的代码或框架.任何帮助将不胜感激.

更新:

一些示例代码,不确定它会有所帮助,因为相同的事情发生在许多完全不同的操作方法和视图中的模式,无论GET,POST,授权,未授权,在角色与否,antiforgerytoken ...

从视图调用标准Html.Action.大多数时候工作正常.(不同的重载没有区别.)

@Html.Action("CategoryDropDowns", "Category")
Run Code Online (Sandbox Code Playgroud)

这是被调用的内容(确切地说返回的内容没有区别,可能是ViewResult,可能是一个int).

// GET: /category/category-drop-downs   
[HttpGet]
[Route("category/category-drop-downs")]           
public ViewResult CategoryDropDowns()
{

}
Run Code Online (Sandbox Code Playgroud)

如果验证失败,则返回视图:

public ActionResult CreateListing(ListDetails listDetails)
{                                       
    if (ModelState.IsValid)
    {
    }
    else
    { …
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
1948
查看次数

ASP.NET MVC5拒绝映射与物理路径匹配的路由

当我使用IIS Express调试/运行并浏览到时http://localhost:1234/People,IIS Express尝试浏览People目录而不是执行People路由,我收到403.14 HTTP错误.所以我StaticFile在Web.config中禁用了处理程序并刷新了.现在我收到404.4 HTTP错误:

404

我知道路由有效,因为如果我重命名RoutePrefix,例如PeopleTest,那么路由被执行,我得到了我期望的响应.

如何说服IIS/Express更喜欢MVC路由而不是静态文件/目录?

我正在使用属性路由; 相关代码如下:

Web.config文件

<system.webServer>
    <modules>
        <remove name="FormsAuthentication" />
    </modules>

    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="TRACEVerbHandler" />
        <remove name="StaticFile"/>
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

Global.asax中

GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutofacConfig.Configure();
Run Code Online (Sandbox Code Playgroud)

启动\ WebApiConfig

namespace MyApi.Startup {
    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            config.MapHttpAttributeRoutes();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

人们\把PeopleController

namespace MyApi.People {
    [RoutePrefix("People")]
    public …
Run Code Online (Sandbox Code Playgroud)

c# model-view-controller asp.net-mvc routing attributerouting

5
推荐指数
1
解决办法
563
查看次数