@ Html.Action使用RouteAttributes在控制器中为ChildOnlyAction抛出InvalidOperationException

时间:2013-12-31 15:58:28

标签: c# routes asp.net-mvc-routing asp.net-mvc-5

我的理解是,子操作使用与父操作相同的路径执行,但是我很难让它工作。我有一个包含几个领域的MVC5应用程序。在一个区域中,我想显示一个部分,每个视图中的一些数据与控制器模型分开,所以我添加了一个子操作来实现这一点,但当我尝试查看该区域中的任何页面时,我得到一个InvalidOperationException告诉我

  

路由表中没有路由与提供的值匹配

区域控制器看起来像这样(简化为简洁):

[RouteArea("SomeArea")]
[RoutePrefix("Here")]
public class PageController : Controller
{
    private readonly IRepository repository;

    public PageController(IRepository Repository)
    {
        this.repository = repository;
    }


    [Route("Page")]
    public ActionResult ShowPage(int pageNumber = 1)
    {
        var model = new PageViewModel(repository, pageNumber);

        ViewBag.Title = "This is a Page";

        return View("ShowPage", model);
    }


    [ChildActionOnly]
    public PartialViewResult DataView()
    {
        var model = new DataViewModel(repository);
        return PartialView("DataView", model);
    }
}

该地区的布局:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@Scripts.Render("~/bundles/pages")
<body>

    <div id="content">
        <br />
        @Html.Partial("~/Areas/Page/Views/Shared/Search.cshtml")
        @RenderBody()

        @Html.Action("DataView", "Page")
    </div>
</body>

路线配置:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        AreaRegistration.RegisterAllAreas();

        routes.MapRoute("Default",
            "{controller}/{action}/{id}",
            new {controller = "Home", action = "Index", id = UrlParameter.Optional}
            );
    }

我尝试在this article by David Boike中捕获未处理的路由例外但无济于事。

此时我们将非常感谢任何建议。感谢

1 个答案:

答案 0 :(得分:2)

Kiran在上面的评论中提供的答案是简单地使用该操作的路由值来装饰子操作。谢谢基兰!

我花费了大量的时间来研究这个问题,并且在我这么做的时候感到沮丧,因为这个简单的解决方案。路由现在适用于子操作,如下所示:

    [ChildActionOnly]
    [Route("DataView")]
    public PartialViewResult DataView()
    {
        var model = new DataViewModel(repository);
        return PartialView("DataView", model);
    }