2010-12-16 43 views
1

是否可以在视图中检测路由值?检测视图中的路由值

/pages/create/1我想查看1是否在那里?

基本上,我想渲染一个基于这个值的不同的局部视图,但我相当肯定这可能不是我想要实现的最好方法。

在附注上,我可以根据控制器中的值来更改部分视图在视图中的渲染效果吗?

回答

1

您可以通过ViewPage.ViewContext.RouteData检查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访问它们。同样的事情也适用于行动过滤器等

1

其他的答案是正确的,但想到我会满足你的最后一句话:

在一个侧面说明,而不是上面做的事情是有可能对我是能够根据我的控制器中的值更改部分视图在视图中呈现的内容?

好局部视图的呈现在视图本身(除非从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调用中使用该名称。

无论漂浮你的船。 :)