Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 属性路由在区域中不起作用_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 属性路由在区域中不起作用

Asp.net mvc 属性路由在区域中不起作用,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,场景:我的ASP.NETMVC5站点中有一个表单区域 我试图重定向到Details操作,该操作使用使用新属性路由功能定义的自定义路由 重定向操作: return RedirectToAction("Details", new { slug }); 我要重定向到的操作: [HttpGet] [Route("forms/{slug}")] public ActionResult Details(string slug) { var form = FormRepository.Get(slu

场景:我的ASP.NETMVC5站点中有一个表单区域

我试图重定向到Details操作,该操作使用使用新属性路由功能定义的自定义路由

重定向操作:

return RedirectToAction("Details", new { slug });
我要重定向到的操作:

[HttpGet]
[Route("forms/{slug}")]
public ActionResult Details(string slug)
{
    var form = FormRepository.Get(slug);

    ...

    return View(model);
}
我希望重定向到
http://localhost/forms/my-slug
但应用程序将我重定向到
http://localhost/Forms/Details?slug=my-slug

这意味着属性路由不起作用

如何解决这个问题

我已经添加了routes.mapmvcattributterroutes();线路至我的路线图:

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 }
        );
    }
}
这是我的应用程序\u Start():


您可能正在将基于约定的路由与属性路由相结合,在映射属性路由后,您应该注册您的区域

线路

AreaRegistration.RegisterAllAreas();
应在此行后调用:

routes.MapMvcAttributeRoutes();
解释(来源):

如果同时使用具有管线属性的区域和具有基于约定的管线(由AreaRegistration类设置)的区域,则需要确保在配置MVC属性管线之后、但在设置默认基于约定的管线之前进行区域注册。原因是路由注册应该从最具体的(属性)到更一般的(区域注册)再到mist通用的(默认路由),以避免通用路由通过在管道中过早匹配传入请求而“隐藏”更具体的路由

当您创建一个空白的asp.net mvc网站、添加一个区域并开始使用属性路由时,您将遇到此问题,因为visual studio中的“添加区域”操作会在路由配置之前在应用程序的\u start中添加RegisterAlareas调用

替代解决方案

也许您不打算继续使用基于约定的路由,而只希望使用属性路由。
在这种情况下,您可以删除FormsAreaRegistration.cs文件。

将AreaRegistration.RegisterAlareas()移动到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();
    }
}

编辑:在某个时候,我遇到了一个来自微软的示例解决方案,它很好地展示了如何处理属性路由。它还展示了一些很好的示例,说明了如何将
SelectList
转换为
input[type=“radio”]
项数组,以及如何使用
input[type=“checkbox”]
项数组(如果我记得的话)。这个示例解决方案可能是对这个问题的一个更好的回答,并且给出了一些显示单选按钮和复选框项的好例子。如果有人知道此示例解决方案,请添加带有链接的评论。

SWEET!在花了将近4个小时试图找出MVC 5.1以后的这个愚蠢的变化之后,您的解决方案一劳永逸地解决了我的问题。我很高兴我的问题+答案随着时间的推移帮助了这么多人:-)这对我来说很有效。。我放弃了区域路线属性,因为它根本不起作用。但是,在将AreaRegistration.RegisterAlareas()移动到routes.MapMVCattributerRoutes()之后,它神奇地完成了这个任务!只有一行可以修复它,打开myAreaRegistration.cs并在添加route
context.Routes.MapMVCatributeRoutes()之前添加代码//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();
    }
}