Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC:一个分部是否知道它是否是从另一个页面请求的?_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc ASP.NET MVC:一个分部是否知道它是否是从另一个页面请求的?

Asp.net mvc ASP.NET MVC:一个分部是否知道它是否是从另一个页面请求的?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我有一个局部视图,可以通过一个动作(下图中的动作2)请求,也可以在另一个页面中用“Html.Action()”(下图中的动作1)呈现。在partial(或partials控制器)中,是否有方法确定这两种方法中的哪一种用于呈现页面 您应该可以从 HttpContext.Current.Request.RawUrl 不,这是不可能的,而且一个partial不需要知道它。应该注意的是,在MVC中做这种事情并不是特别好的做法。分部不应关心其“父项”。。。但如果你真的需要这么做,无论出于什么原因 您可以

我有一个局部视图,可以通过一个动作(下图中的动作2)请求,也可以在另一个页面中用“Html.Action()”(下图中的动作1)呈现。在partial(或partials控制器)中,是否有方法确定这两种方法中的哪一种用于呈现页面


您应该可以从

HttpContext.Current.Request.RawUrl

不,这是不可能的,而且一个partial不需要知道它。

应该注意的是,在MVC中做这种事情并不是特别好的做法。分部不应关心其“父项”。。。但如果你真的需要这么做,无论出于什么原因

您可以在局部视图的控制器中使用此代码来确定它是直接加载还是包含在另一个页面中

// this is the route which was originally used to route the request
string req_controller = Request.RequestContext.RouteData.Values["controller"].ToString();
string req_action = Request.RequestContext.RouteData.Values["action"].ToString();

// this is the route which was used to route to this action/view
string this_controller = RouteData.Values["controller"].ToString();
string this_action = RouteData.Values["action"].ToString();

if (req_controller == this_controller && req_action == this_action)
{
  // this partial was loaded directly
}
else
{
  // this partial was loaded indirectly
}

您可以使用或检查
DataTokens
是否存在键为
“ParentActionViewContext”的内容
如果您无法访问
ControllerContext

我想知道这一点的原因是,我希望能够根据局部视图是从控制器操作还是从另一个页面中呈现的,来切换其布局

// this is the route which was originally used to route the request
string req_controller = Request.RequestContext.RouteData.Values["controller"].ToString();
string req_action = Request.RequestContext.RouteData.Values["action"].ToString();

// this is the route which was used to route to this action/view
string this_controller = RouteData.Values["controller"].ToString();
string this_action = RouteData.Values["action"].ToString();

if (req_controller == this_controller && req_action == this_action)
{
  // this partial was loaded directly
}
else
{
  // this partial was loaded indirectly
}

将产生一个包含必要菜单栏和其他站点装饰的布局

只嵌入内容而不添加页面的其余部分

因此,在我的页面的默认布局中,我有:

@if (this.IsPartial()) {
    Layout = null;
} else {
    Layout = "_SiteLayout";
}
@RenderBody()
以下是我的发现:

public static bool IsPartialResult(this WebPageBase @this)
{
    return !@this.OutputStack.Any(writer => writer is HttpWriter);
}

它可能不会在所有情况下都起作用。但这对我很有效。YMMV/HTH

您可以使用一个控制器操作,在某些情况下,该操作返回一个主视图,该主视图依次呈现局部视图,在其他情况下,直接返回指定其完整路径的局部视图。在这两种情况下,
HttpContext.Current.Request.RawUrl
在该部分中都是相同的。是否有否决投票的原因?请在否决投票时留下评论,解释为什么你认为答案是错误的。你的答案是错误的(有一种方法),并且实际上没有以任何方式回答问题(我不是问这是否是一种好的做法)。@Nippysaurus,请参阅我对你答案的评论,以获取反例。这不起作用。尝试编写以下控制器操作:
public ActionResult Index(bool?directly){if(directly!=null&&directly.Value)返回PartialView(“MyPartial”);else返回View();}
。现在在
Index.cshtml
视图中呈现部分。当您使用等于false的布尔参数调用此操作时,它将呈现索引视图,该视图将依次包含包含代码的部分。然后尝试传递true,以便直接渲染部分。在这两种情况下,你的第一个
if
条件都会得到满足。@Darwin:你对我的问题的理解是完全正确的,不过我的意思稍有不同,也许可以解释得更好一些。“直接请求”是指通过URL。所以“vs”(其中包括分部)。您不能直接请求分部。永远不会提供驻留在Views文件夹中的视图。您必须始终通过控制器操作。因此,像
mysite/home/\u partial
这样的url毫无意义,除非
\u partial
是在
home
控制器上定义的操作。它确实在home控制器中定义了一个操作。好的,那么这个操作做什么呢?它返回一个部分?只有当您使用
Html.Action
来呈现子操作时才是这样,但是如果您使用
Html.partial
来呈现部分则没有帮助。每个试图回答这个问题的人,当我问这个问题时,我对ASP.NET MVC是非常陌生的,尽管我当时尽了最大努力来澄清我的问题,但很明显,现在我不知道发生了什么。我现在已经有了几个月的经验,并且已经重新编写了这个问题以使其具有一定的意义。另一个无可否认的垃圾处理方法是在@Html.Partial逻辑周围设置一个标志,并在“Layout=”代码中使用它。这在我们的案例中是有效的,因为这类案例很少
public static bool IsPartialResult(this WebPageBase @this)
{
    return !@this.OutputStack.Any(writer => writer is HttpWriter);
}