Asp.net mvc Asp.NETMVC3重定向

Asp.net mvc Asp.NETMVC3重定向,asp.net-mvc,Asp.net Mvc,我有一个如下所示的动作。在GetAvailableBookList中,我获取列表,如果没有任何可用的书籍,则重定向到消息页面。但在操作中,部分代码继续执行,并得到一个异常,我发现自己进入了错误页面。 我不想使用return RedirectToAction或类似的东西,因为我们在应用程序中有很多地方使用这种重定向逻辑 public ActionResult ActionName() { List<BookType> bookList = GetAvai


我有一个如下所示的动作。在GetAvailableBookList中,我获取列表,如果没有任何可用的书籍,则重定向到消息页面。但在操作中,部分代码继续执行,并得到一个异常,我发现自己进入了错误页面。 我不想使用return RedirectToAction或类似的东西,因为我们在应用程序中有很多地方使用这种重定向逻辑

    public ActionResult ActionName()
    {
        List<BookType> bookList = GetAvailableBookList();
        // some code
        return View("RelatedView");
    }

    private List<BookType> GetAvailableBookList()
    {
        ....
        list  = GetList();
        if(list.Count == 0)
        {
            System.Web.HttpContext.Current.Response.Redirect(messagePageUrl, true);
        }
        else return list;
    }
public ActionResult ActionName()
{
List bookList=GetAvailableBookList();
//一些代码
返回视图(“关联视图”);
}
私有列表GetAvailableBookList()
{
....
list=GetList();
如果(list.Count==0)
{
System.Web.HttpContext.Current.Response.Redirect(messagePageUrl,true);
}
其他返回列表;
}
使用

如果您有要执行的特定操作。NoListAvailable操作可以返回指示问题的视图

或者,您可以直接返回视图

return View("NoListAvailable");

您得到的异常可能是ThreadAbortException,除非您允许线程继续(Response.Redirect中的第二个参数),否则这是无法避免的


另一方面,您当前的解决方案通常存在缺陷。当方法返回空列表时,应该在每个操作中使用RedirectToAction。

不幸的是,
Response.Redirect()
对ASP.NET MVC并不友好。我的经验法则是,如果它来自HttpContext,我不想在控制器中触碰它(当然,该规则有很多例外)——特别是因为它提高了可测试性

我的建议是使用
重定向到操作
,但由于您不想重复代码,因此可以这样做,即不必重复代码(尽管在这种情况下,我认为重复代码没有问题)

public ActionResult加载booklist并继续(
Func(续)
{
var list=LoadBooklist();
if(list.Any())
{
归还行动(续);
}
返回新的重定向结果(messagePageUrl);
}
//在控制器中
公共ActionResult ActionName()
{
返回LoadBookList并继续(
列表=>{
//一些代码
返回视图(“关联视图”);
});
}

它漂亮吗?不,但它比重定向异常工作得更好。

抛出特定异常并重定向到捕获它的位置可能是解决方案

尝试编写

System.Web.HttpContext.Current.Response.Redirect(messagePageUrl, false);

他说他不想那样做。我不想返回我在问题中所说的任何东西,我只想做一个经典重定向。我真的不明白重定向操作和经典重定向之间的区别。一个保持MVC模式,另一个打破它。是否确实需要响应。重定向()?在操作中,必须返回某些内容。我想在不返回任何内容的情况下中断动作流。一个动作只需返回一个视图。使用Redirect()时,您将浏览器指向另一个资源,通常是HTML页面,这就是视图。我是否遗漏了什么?我的意见是,您不在GetAvailableBookList()级别执行重定向,而是在ActionResult ActionName()级别执行重定向。正如您所提到的,由于GetAvailableBookList()是从不同的区域调用的,所以我将在我不想执行的每个操作中重复重定向。这是一个具体的例子。在业务部分,我们为了几个目的多次执行此重定向。例如,在获取列表时,我可能希望检查用户现在是否可以看到此列表的时间。异常是因为在例如的代码中,我使用了类似的内容:list[0],并且由于list为null,我得到了异常
public ActionResult LoadBookListAndContinue(
  Func<List<BookType>, ActionResult> continuation)
{
   var list = LoadBooklist();
   if(list.Any())
   {
     return action(continuation); 
   }
   return new RedirectResult(messagePageUrl);
}


// in your controller
public ActionResult ActionName()
{
  return LoadBookListAndContinue(
    list => {
      // some code
      return View("RelatedView");
    });
}
System.Web.HttpContext.Current.Response.Redirect(messagePageUrl, false);