2011-04-13 47 views
5

所以我在这里看到this question这个,但它并没有真正解决这个问题给我。ASP.NET MVC 3 + Razor错误:不允许子动作执行重定向动作

我有一个ASP.NET MVC 3 + Razor应用程序,运行在我的开发电脑上的IIS5上,然后是我的开发Web服务器的IIS6。一切工作很好,直到我部署它。我正在部署所有的东西,在这方面没有问题(我可以说)。

现在我得到这个子操作不允许在我的页面上执行重定向操作错误。我不确定如何查明它失败的位置。

我使用@ Html.Action在某些下拉框与数据拉:

public ActionResult Hierarchy() 
    { 
     List<Store> storeList = DBService.getStores();    
     if (DBService.Error != null) 
      return RedirectToError(DBService.Error); 

     List<Department> deptList = DBService.getDepts(); 
     if (DBService.Error != null) 
      return RedirectToError(DBService.Error); 

     VM_Hierarchy hierarchy = new VM_Hierarchy(storeList, deptList); 

     return View(hierarchy); 
    } 

如果我删除@ Html.Action线,页面将呈现。然后,将打破,如果我做一个AJAX请求到一个控制器动作像这样:

[HttpPost] 
    public ActionResult InventoryList(string fromDate, string toDate) 
    { 
     List<Inventory> inventories = DBService.getInventories(fromDate, toDate); 

     if (DBService.Error != null) 
      return RedirectToAction("Error"); 

     return View(inventories); 
    } 

如果这是不正确的,我怎么重定向到一个错误页面或规定在获取返回什么看法张贴?任何帮助表示赞赏。谢谢。

回答

7

这可能是因为您在部署时从您的数据库服务中收到错误,而您本地没有收到错误。这导致它尝试从一个你不能做的儿童动作重定向。

您可能想要尝试获取主操作中的下拉数据,并将其全部放入ViewModel中,以便您不使用子操作。如果失败了,你可以重定向到你心中的内容。对于AJAX,您需要处理客户端上的错误并做一些明智的事情,您不能仅仅通过AJAX调用返回重定向。

这个问题有一些进一步的信息: Why are Redirect Results not allowed in Child Actions in Asp.net MVC 2

+0

因此,假设重定向都发生在服务器上,它只是发回新页面的HTML是错误的吗?我不想实际重定向页面,只是执行不同的操作并发回不同的视图。 – IronicMuffin 2011-04-13 15:55:06

+0

那么,从控制器重定向都在服务器上,问题是你从一个子动作或AJAX调用重定向 - 在这两种情况下,页面的一部分已经存在,并且你不能只在页面中间。 – 2011-04-13 15:59:09

+0

我想我不会效仿。我想我要么获取原始视图的HTML或新的视图的HTML呈现到页面。我看不出问题在哪里。我想我会回发JavaScript的部分?如何根据服务器端发生的情况选择要加载的部分? – IronicMuffin 2011-04-13 16:04:32

1

我也有类似的问题,但对我的生活,我无法揣摩出重定向来自何处。一旦我明白了,我想我会发布一个答案,以防万一发生在其他人身上。

如果重定向的来源不是来自势在必行代码明显,例如:

[AuthoriseThis] 
    public ActionResult Details(SomethingModel something) 
    { 
     return PartialView(something); 
    } 

看看声明代码!

在我的情况下,这是一个授权问题,因此该属性导致重定向,我的眼睛过滤了该属性的存在。

2

如果你把孩子动作 (ControllerContext.ParentActionViewContext.Controller as System.Web.Mvc.Controller).Response.Redirect(Url.Action("Action", "Controller"));它会从childaction重定向。

相关问题