2012-01-11 65 views
1

编辑:显然,这是我的网站的一个大大简化版本,如果我做了一个测试应用程序,与此模式,它工作正常。在我们的真实应用程序中,我们使用的是T4MVC,并且这些都在一个区域内。我猜这些因素之一导致我的问题...Razor中嵌套的Html.Action调用

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

然后我有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调用Child视图(并构建模型并在视图中传递它),则呈现效果良好。当我在一个已经使用Html.Action呈现的视图中调用Html.Action时,问题就出现了。

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

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

回答

1

看来问题在于我们的区域和路由设置。

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

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

3

那么,开箱即用的MVC 3具有名为id的默认路由参数。您的SubChild操作具有名为val的参数,因此可能是此问题。

无论是在操作参数重命名为ID,或添加新的路由

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

是你的参数真名叫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)); 
} 

然后在你的意见的代码必须是: Index.cshtml

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

Child.cshtml

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