Razor中嵌套的Html.Action调用

本文关键字:Action 调用 Html 嵌套 Razor | 更新日期: 2023-09-27 18:20:12

EDIT:很明显,这是我的网站的一个大大简化的版本,如果我制作一个测试应用程序,使用这种模式,它可以很好地工作。在我们真正的应用程序中,我们使用T4MVC,这一切都在一个区域内。我猜是其中一个因素导致了我的问题。。。

编辑2:所有默认路由都已定义,如果我直接导航到/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));
}

然后我有三个剃刀的看法。

索引.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>

当我导航到/时,会抛出一个异常,说明"路由表中没有与提供的值匹配的路由。"。

这一切都在同一个区域和同一个控制器内。如果我更改标记并使用Html.Partial调用Child视图(并构造模型并在视图中传递它),它会显示良好。当我在已经使用Html.Action.呈现的视图中调用Html.Action时,问题就出现了

我已尝试使用/area/controller/action,在Html.action调用中指定控制器,将area作为路由值和所有这些值的组合中的参数传递。

有人知道这可能是什么吗?我假设你可以在使用它渲染的视图中调用Html.Action,我想我可能错了。。。

Razor中嵌套的Html.Action调用

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

将Action中的参数重命名为id,或者添加一个新的路由

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

您的参数真的命名为blahval吗?因为通常第一个参数总是被称为id。检查global.asax.cs中的方法RegisterRoutes(RouteCollection routes)。肯定有类似的东西

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));
}

那么您的视图中的代码必须是:索引.cshtml

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

Child.cshtml

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

问题似乎与我们的区域和路由设置有关。

在第二次通行证中,我们失去了对routevalue字典中该区域的引用,因此无法找到正确的路线。在我们登记区域的地方,我们需要登记正确的路线。

感谢你在这方面的帮助,我对其他答案投了赞成票,因为我认为它们将来可能会帮助其他人。