在Razor中嵌套的Html.Action调用

时间:2012-01-11 16:05:55

标签: c# asp.net-mvc asp.net-mvc-3 razor

编辑:显然这是我的网站的一个非常简化的版本,如果我做一个测试应用程序,使用这种模式它工作正常。在我们的真实应用程序中,我们使用的是T4MVC,这都在一个区域内。我猜其中一个因素导致了我的问题...

EDIT2:定义了所有默认路由,如果我直接导​​航到/ AreaName / ControllerName / SubChild?val = 123,则会渲染。

我对Mvc有一个特殊的问题,我希望有人可以提供帮助...

我有一个带有以下操作方法的控制器

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

public ActionResult Result Child(string blah)
{
   return View(GetModel(blah));
}

public ActionResult Result SubChild(int val)
{
   return View(GetModel(val));
}

然后我有3个剃刀视图。

Index.cshtml

<div>
@Html.Action("Child", new { blah = "raaa"})
</div>

Child.cshtml

    <div>
@*ERROR HERE*@
    @Html.Action("SubChild", new { val = 123})
    </div>

SubChild.cshtml

<h1>@Model.val</h1>

当我导航到/我得到一个异常抛出的说法 “路由表中没有路由与提供的值匹配。”在调用SubChild Action的Html.Action上。

这都在同一区域内且控制器相同。如果我更改标记并使用Html.Partial调用子视图(并构造模型并在视图中传递它),它会呈现正常。当我在已经使用Html.Action呈现的视图中调用Html.Action时会出现问题。

我尝试使用完全限定动作 / area / controller / action,在Html.Action调用中指定控制器,将该区域作为参数传递给路由值和所有这些中的组合。

有没有人有任何想法可能是什么?我假设你可以在使用它渲染的视图中调用Html.Action,我想我可能错了......

3 个答案:

答案 0 :(得分:3)

嗯,开箱即用的MVC 3有一个名为id的默认路由参数。您的SubChild操作有一个名为val的参数,因此这可能就是问题所在。

将Action中的参数重命名为id,或添加新路径

routes.MapRoute(
    "SubChild", 
    "{controller}/SubChild/{val}", 
    new
    {
        controller = "ControllerName",
        action = "SubChild",
        val = UrlParameter.Optional
    }
);

答案 1 :(得分:2)

您的参数是否真的命名为blahval?因为通常第一个参数总是被称为id。检查RegisterRoutes(RouteCollection routes)中的方法global.asax.cs。必须有像

这样的东西
routes.MapRoute("Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults

表示您的参数必须如何命名。

我认为你的行动必须是这样的:

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

public ActionResult Result Child(string id)
{
    return View(GetModel(id));
}

public ActionResult Result SubChild(int id)
{
    return View(GetModel(id));
}

然后你的观点中的代码必须是: Index.cshtml

<div>
    @Html.Action("Child", new { id = "raaa"})
</div>

Child.cshtml

<div>
    @Html.Action("SubChild", new { id = 123})
</div>

答案 2 :(得分:1)

问题出现在我们的区域和路由设置上。

在第二遍中,我们丢失了对routevaluedictionary中区域的引用,因此无法找到正确的路径。在我们注册该区域的地方,我们需要注册正确的路线。

感谢您的帮助,我提出了其他答案,因为我认为他们将来可能会帮助其他人。