我刚开始在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来解决这个问题.
我有一个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.
我在获取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物体上移开,一切正常,但我需要时间过去.
使用AttributeRouting库,我可以将路由限制为特定的动词:
[Route("customers", HttpVerbs.Post)]
Run Code Online (Sandbox Code Playgroud)
在MVC 5中,内置了AttributeRouting,但是使用HttpVerbs时没有重载。在这种情况下,如何限制到POST的路由?
当我尝试在不同的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)
如何隔离这两个应用程序,以便属性路由不冲突?
我在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)
这对我来说似乎很糟糕.我不是重复实际操作方法的代码(在某些情况下是相当多的),至少,但这对我来说感觉不对.此外,在基本操作方法定义由于某种原因而发生变化的情况下,这会成为一种维护噩梦.通常,我是否有某些方法可以在不必覆盖方法的情况下更改属性?也许,某些属性特定于路由.或者我只是运气不好?
我正在使用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
我想为管理/身份验证的控制器和视图中的公共/匿名控制器和视图提供一些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
以下是我整个网站中不同操作和视图的一些奇怪行为:
每当我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
当我使用IIS Express调试/运行并浏览到时http://localhost:1234/People,IIS Express尝试浏览People目录而不是执行People路由,我收到403.14 HTTP错误.所以我StaticFile在Web.config中禁用了处理程序并刷新了.现在我收到404.4 HTTP错误:
我知道路由有效,因为如果我重命名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
attributerouting ×10
c# ×7
asp.net-mvc ×5
asp.net ×2
routes ×2
.net ×1
datetime ×1
owin ×1
routing ×1