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,我想我可能错了。。。
好吧,开箱即用的MVC 3有一个名为id
的默认路由参数。您的SubChild
操作有一个名为val
的参数,所以这可能就是问题所在。
将Action中的参数重命名为id,或者添加一个新的路由
routes.MapRoute(
"SubChild",
"{controller}/SubChild/{val}",
new
{
controller = "ControllerName",
action = "SubChild",
val = UrlParameter.Optional
}
);
您的参数真的命名为blah
和val
吗?因为通常第一个参数总是被称为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字典中该区域的引用,因此无法找到正确的路线。在我们登记区域的地方,我们需要登记正确的路线。
感谢你在这方面的帮助,我对其他答案投了赞成票,因为我认为它们将来可能会帮助其他人。