我正在使用Ajax.BeginForm来创建一个表单,它将ajax回发到某个控制器操作,然后如果操作成功,用户应该被重定向到另一个页面(如果操作失败,那么将显示一个状态消息AjaxOptions UpdateTargetId).
using (Ajax.BeginForm("Delete", null,
new { userId = Model.UserId },
new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
new { name = "DeleteForm", id = "DeleteForm" }))
{
[HTML DELETE BUTTON]
}
Run Code Online (Sandbox Code Playgroud)
如果删除成功,我将返回重定向结果:
[Authorize]
public ActionResult Delete(Int32 UserId)
{
UserRepository.DeleteUser(UserId);
return Redirect(Url.Action("Index", "Home"));
}
Run Code Online (Sandbox Code Playgroud)
但是Home Controller Index视图已加载到UpdateTargetId中,因此我最终得到了页面中的页面.我正在考虑的两件事:
有人对#1发表评论吗?或者,如果#2是一个很好的解决方案,那么"重定向javascript视图"会是什么样子?
我使用Asp.Net Futures RenderAction方法渲染了一些部分动作.其中一些在处理完表单后执行重定向.
现在我升级到Asp.Net MVC 2 RC它给我一个错误"不允许子操作执行重定向操作".
我检查了源代码,然后找到了抛出异常的行.为了解决这个问题,我可以制作一个自定义的RedirectResult,但在此之前,我想了解为什么框架首先不允许它.必须有一个很好的理由,也许我不应该这样做.
有谁知道这个限制的原因?
谢谢
在_Layout.cshtml文件中,我有以下条目:
@Html.Action("LoadPagesStructure", "Page")
Run Code Online (Sandbox Code Playgroud)
在PageController类中,LoadPagesStructure方法如下:
[ChildActionOnly] /* this attribute indicates that an action should not
be invoked as a result of a user request (by url) */
public ActionResult LoadPagesStructure()
{
ViewModel.Pages = new List<string>() {"page1", "page2", "page3"};
return View();
}
Run Code Online (Sandbox Code Playgroud)
最后,我的LoadPagesStructure.cshtml视图如下所示:
@inherits System.Web.Mvc.WebViewPage<dynamic>
<ul>
@foreach (var page in View.Pages) {
<li>
@Html.ActionLink(page, "Index", "Home")
</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)
不幸的是,执行后会抛出异常:
System.InvalidOperationException: Child actions are not allowed to perform redirect actions.
Run Code Online (Sandbox Code Playgroud)
动态创建指向我页面的链接的方式是什么?
PS:我知道我可以这样做:<a …