是否可以在视图中检测路线值?
例如/pages/create/1
,我想查看1是否存在?
基本上,我想基于这个值渲染一个不同的局部视图,虽然我很确定这可能不是我想要实现的最佳方式。
在旁注中,我可以根据控制器中的值更改视图中呈现的部分视图,而不是执行上述操作吗?
答案 0 :(得分:5)
ViewContext.RouteData.Values["whatever"]
答案 1 :(得分:1)
您可以通过RouteData
检查ViewPage.ViewContext.RouteData
对象。然后使用
string areaname = routeData.Values["area"] as string;
string controllername = routeData.Values["controller"] as string;
string actionname = routeData.Values["action"] as string;
string id = routeData.Values["id"] as string;
如果您发现要在控制器中检查这些值,则可以使用ControllerBase.ControllerContext.RouteData访问它们。类似的东西适用于动作过滤器等。
答案 2 :(得分:1)
其他答案都是正确的,但我想我会解决你的最后一句:
在旁注中,我可以根据控制器中的值更改视图中呈现的部分视图,而不是执行上述操作吗?
使用以下代码在View本身中呈现部分视图(除非从JavaScript调用并直接绑定到DOM):
<%: Html.RenderPartial("SomePartial") %>
因此,为了防止视图中出现“代码汤”(if语句),您需要使用HTML帮助程序,在检查ViewContext后调用RenderPartial:
public static string RenderCustomPartial(this HtmlHelper helper, RouteData rd)
{
string partialName;
if (rd.Values["SomeParam"] == 1)
partialName = "PartialOneName";
else
partialName = "PartialTwoName";
return helper.RenderPartial(partialName);
}
然后在视图中:
<%: Html.RenderCustomPartial(ViewContext.RouteData) %>
你可以对上面做一些修改 - 比如直接在扩展中访问路径数据,通过模型来绑定部分等等 - 但是你明白了。
或者,您可以在控制器中执行上述IF语句,并将部分视图名称填充到ViewData中,然后在视图中的常规RenderPartial调用中使用它。
无论你的船漂浮着什么。 :)