Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 2中的子操作中不允许重定向结果_Asp.net Mvc_Asp.net Mvc 2_Theory - Fatal编程技术网

Asp.net mvc 为什么Asp.net MVC 2中的子操作中不允许重定向结果

Asp.net mvc 为什么Asp.net MVC 2中的子操作中不允许重定向结果,asp.net-mvc,asp.net-mvc-2,theory,Asp.net Mvc,Asp.net Mvc 2,Theory,我有一些使用Asp.Net Futures RenderAction方法呈现的部分操作。其中一些在处理表单后执行重定向 现在我升级到Asp.NETMVC2RC,它给了我一个错误“不允许子操作执行重定向操作” 我检查了源代码,找到了引发异常的行。为了解决这个问题,我可以创建一个自定义重定向结果,但在此之前,我想先了解一下为什么框架不允许它。一定有很好的理由,也许我也不应该这样做 有人知道这个限制的原因吗 感谢由于MVC已经开始向客户端呈现视图,因此存在限制。从此点重定向的效果尚未定义。它可以完美地

我有一些使用Asp.Net Futures RenderAction方法呈现的部分操作。其中一些在处理表单后执行重定向

现在我升级到Asp.NETMVC2RC,它给了我一个错误“不允许子操作执行重定向操作”

我检查了源代码,找到了引发异常的行。为了解决这个问题,我可以创建一个自定义重定向结果,但在此之前,我想先了解一下为什么框架不允许它。一定有很好的理由,也许我也不应该这样做

有人知道这个限制的原因吗


感谢

由于MVC已经开始向客户端呈现视图,因此存在限制。从此点重定向的效果尚未定义。它可以完美地工作,它可以继续渲染原始视图而不重定向,它可以抛出不同的异常,等等

由于执行此操作的结果未定义,因此框架会阻止它。实际上,出于类似的原因,除了视图(或类似于视图的内容)之外,不应使用RenderAction来呈现任何内容


在您的特定情况下,外部操作应该重定向。如果你最终只是从视图中重定向,而没有向用户显示任何内容,那么首先浏览视图是没有意义的,因为外部操作可以自己适当地委派工作。

在这种情况下,只需将部分视图表单的提交url指向作为问题重定向目标的操作,并让它自己执行重定向到其GET版本

在我的例子中,呈现的表单是我正在构建的网站扩展上的“配置”面板。我希望扩展自己的控制器能够处理表单处理,然后重定向回列出所有配置扩展的管理页面。我认为在这里要求父页面的控制器处理扩展的表单是不合适或不实际的。您建议我怎么做?

有时,当您尝试呈现基本操作结果的操作时,会出现此错误。 例如:

我的解决方案

行动方法:

return View("Redirect", model);
视图:


document.location='';

尝试在子操作中使用类似的内容:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());

在我不寻常的情况下,我的控制器上附加了一个自定义的authorized属性,该属性试图在子操作上重定向,这是(如上所述)不允许的

为了解决此问题,我删除了所有子操作的授权检查重定向:

Public Overrides子授权(filterContext作为授权上下文)
//子操作无论如何都无法重定向,因此无需检查权限。
如果filterContext.IsChildAction,则退出Sub
.. 母公司授权检查。。

这与我的情况相同。因为我只是在管理页面上使用它来扩展,所以我决定将重定向保留在子操作控制器中。我编写了我自己的ChildActionRedirectResult,然后创建了一个ChildActionController基,它覆盖重定向方法以使用我自己的结果。对于前端使用,我不会这样做。我只是返回一个简单的视图结果,其中包含一条“您的更改已保存”消息和一个指向管理扩展的管理页面的链接。虽然没有那么漂亮,但它确实起到了作用。我在一个登录操作中使用了它,该操作显示为主页的部分视图,在成功登录时需要重定向。这实际上会导致客户端浏览器在收到重定向标题后重新请求该页面,但它工作得很好。
<script type="text/javascript" language="javascript">
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>
ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());