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,我想我可能错了......
答案 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)
您的参数是否真的命名为blah
和val
?因为通常第一个参数总是被称为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中区域的引用,因此无法找到正确的路径。在我们注册该区域的地方,我们需要注册正确的路线。
感谢您的帮助,我提出了其他答案,因为我认为他们将来可能会帮助其他人。