Sru*_*uly 23 theory asp.net-mvc asp.net-mvc-2
我使用Asp.Net Futures RenderAction方法渲染了一些部分动作.其中一些在处理完表单后执行重定向.
现在我升级到Asp.Net MVC 2 RC它给我一个错误"不允许子操作执行重定向操作".
我检查了源代码,然后找到了抛出异常的行.为了解决这个问题,我可以制作一个自定义的RedirectResult,但在此之前,我想了解为什么框架首先不允许它.必须有一个很好的理由,也许我不应该这样做.
有谁知道这个限制的原因?
谢谢
Lev*_*evi 36
存在限制是因为MVC已经开始向客户端呈现视图.从这一点重定向的影响是不确定的.它可以完美地工作,它可以继续呈现原始视图而无需重定向,它可以抛出不同的异常,等等.
由于执行此操作的结果未定义,因此框架会阻止它.实际上,出于类似的原因,永远不应该使用RenderAction来呈现除视图(或类视图内容)之外的任何内容.
在您的特定情况下,外部操作应该重定向.如果你最终还是要从视图中重定向而不向用户显示任何内容,那么首先没有目的通过视图,因为外部动作可能已经适当地委托了它的工作拥有.
小智 17
尝试在Child Action中使用类似的东西:
ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());
Run Code Online (Sandbox Code Playgroud)
Vla*_*mir 13
我的解决方案
行动方式:
return View("Redirect", model);
Run Code Online (Sandbox Code Playgroud)
视图:
<script type="text/javascript" language="javascript">
document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>
Run Code Online (Sandbox Code Playgroud)
在我的例子中,正在呈现的表单是我正在构建的网站的扩展上的"配置"面板.我希望扩展程序自己的控制器能够处理表单处理,然后重定向回列出所有已配置扩展的管理页面.我不认为让父页面的控制器处理扩展表单是合适的或实际的.你会建议我做什么呢?
在我的不寻常的情况下,我有一个自定义AuthorizeAttribute附加到我的控制器,它试图重定向子动作,这是(如上所述)不允许.
为解决此问题,我删除了所有子操作的授权检查重定向:
Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)
//Child actions cannot redirect anyway, so no need to check permissions.
If filterContext.IsChildAction Then Exit Sub
.. parent authorisation checks ..
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30440 次 |
| 最近记录: |