Tho*_*ock 45 asp.net-mvc asp.net-mvc-routing
场景:我的ASP.NET MVC 5站点中有一个Forms区域.
我正在尝试重定向到Details Action,它使用使用新的Attribute Routing功能定义的自定义路由.
RedirectToAction:
return RedirectToAction("Details", new { slug });
Run Code Online (Sandbox Code Playgroud)
我正在重定向到的操作:
[HttpGet]
[Route("forms/{slug}")]
public ActionResult Details(string slug)
{
var form = FormRepository.Get(slug);
...
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
我希望重定向,http://localhost/forms/my-slug但应用程序将重定向到我http://localhost/Forms/Details?slug=my-slug.
这意味着属性路由不起作用.
怎么解决这个问题?
我添加了routes.MapMvcAttributeRoutes(); 到我的RouteConfig:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Application_Start():
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Run Code Online (Sandbox Code Playgroud)
Tho*_*ock 89
您可能将基于约定的路由与属性路由组合在一起,并且应在映射属性路由后注册区域.
这条线
AreaRegistration.RegisterAllAreas();
Run Code Online (Sandbox Code Playgroud)
应该在这一行之后调用:
routes.MapMvcAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)
如果您同时使用具有路由属性的区域和具有基于约定的路由的区域(由AreaRegistration类设置),则需要确保在配置MVC属性路由后发生区域注册,但是在默认的基于约定的路由之前组.原因是路由注册应该从最具体(属性)到更通用(区域注册)到雾通用(默认路由)进行排序,以避免通用路由通过过早匹配传入请求来"隐藏"更具体的路由.管道.
当您创建一个空白的asp.net mvc网站,添加一个区域并开始使用属性路由时,您将遇到此问题,因为Visual Studio中的"添加区域"操作会在路由配置之前在Application_Start中添加RegisterAllAreas调用.
替代方案
也许您不打算继续使用基于约定的路由,而更喜欢仅使用属性路由.在这种情况下,您只需删除FormsAreaRegistration.cs文件即可.
Mic*_*ida 38
将AreaRegistration.RegisterAllAreas()移动到RouteConfig.cs对我来说还不够.我还需要为RouteArea attibute使用AreaPrefix参数:
//Use the named parameter "AreaPrefix"
[RouteArea("AreaName", AreaPrefix = "area-name-in-url")]
[RoutePrefix("controller-name-in-url")]
public class SampleController : Controller
{
[Route("{actionParameter}")]
public ActionResult Index(string actionParameter)
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:在某些时候,我遇到了一个来自Microsoft的示例解决方案,很好地展示了如何处理属性路由.它还展示了一些很好的例子,说明如何将一个项目转换SelectList成一个input[type="radio"]项目数组input[type="checkbox"](如果我记得的话).这个示例解决方案可能是这个问题的更好答案 - 以及在显示单选按钮和复选框项目时提供一些很好的示例.如果有人知道这个示例解决方案,请添加一个带有链接的评论.
| 归档时间: |
|
| 查看次数: |
27690 次 |
| 最近记录: |