C# 并非所有路径都返回值。-可选退货?

C# 并非所有路径都返回值。-可选退货?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我得到的错误是“并非所有路径都返回值”,我完全理解原因 如您所见,我想重定向未登录的用户,显然没有返回视图 我肯定我做得不对。我该怎么做呢 public ActionResult Confirmation (Order Order) { if (Session["CompanyID"] == null) { string url = Request.Url.Host; if (Request.Url.Port

我得到的错误是“并非所有路径都返回值”,我完全理解原因

如您所见,我想重定向未登录的用户,显然没有返回视图

我肯定我做得不对。我该怎么做呢

    public ActionResult Confirmation (Order Order) {
        if (Session["CompanyID"] == null)
        {
            string url = Request.Url.Host;
            if (Request.Url.Port != null)
            {
                url = url + Request.Url.Port;
            }
            url = url + "/signin.asp";
            Response.Redirect(url);


        }
        else
        {

            int userID = (int)Session["CompanyID"];
            Corp_User User = Repository.CorpUserDetails(userID);

            return View(new OrderLocation { Order = Order, Location = WhygoRepository.RoomDetails(Order.roomId).First(), Corp_User = User });
        }


    }

请注意,我需要重定向到经典ASP页面,而不是MVC操作。

您必须返回操作结果。使用“重定向到操作”

公共行动结果确认(订单)
{
如果(会话[“公司ID”]==null)
{
字符串url=Request.url.Host;
if(Request.Url.Port!=null)
{
url=url+Request.url.Port;
}
url=url+“/signin.asp”;
返回重定向到操作();
}
其他的
{
int userID=(int)会话[“CompanyID”];
Corp_User=Repository.CorpUserDetails(userID);
返回视图(neworderlocation{Order=Order,Location=WhygoRepository.RoomDetails(Order.roomId.First(),Corp_User=User});
}
}

您可以返回null并进行检查


编辑:我很快,忽略我:p

您可以返回重定向结果-

只需将
返回nullResponse.Redirect(url)下的code>它实际上永远不会到达那个位置,但它将消除编译器错误。

好吧,这实际上是一个好问题。请参阅dknaack的答案,以了解您的特定情况下的解决方案,但在其他情况下,我们可能不会如此幸运

从技术上讲,这种情况是非常合乎逻辑的。重定向只是打开一个新请求,让当前请求很好地处理自己,或者强制关闭自己。在所有情况下,当前方法都需要返回值。If Redirect让当前进程能够很好地处理自己,这意味着您应该有一个有意义的返回值

我认为一个解决方案是在重定向之后抛出一个特定的异常。比如:

public string GetCurrentUserName()
{
    if (!authenticated)
    {
        Response.Redirect(LoginScreen);

        throw new UnresolvedMethodException();
    }
    else
    {
        return UserName;
    }
}

返回NULL是一个我不会花钱的选项,因为NULL也可能意味着没有设置用户名(在上述情况下,用户可能会使用电子邮件登录,使用户名可选)。

请参阅其他答案,返回NULL并不漂亮这不是真的。Null是未初始化对象的默认值。危险的是使用没有实际值的初始化对象。@hcb所以从语义上考虑,当MVC控制器操作返回null时,这意味着什么?为什么调用Response.Redirect()并在可以返回RedirectTo操作结果时返回null更好?@Onkelborg+1,我认为这些反应很多。重定向建议来自WebForms的家伙,他们没有太多MVC经验…+1,因为“我肯定我做得不对。”@dknaack-谢谢你的回答。在这种情况下,我无法执行重定向操作,因为我必须重定向到一个经典的asp登录页面…@iKode,这使事情变得有点复杂。在这种情况下,您需要将一条路径映射到经典的asp登录页面,以便MVC引擎跳过它。@iKode:Ok,这很复杂。我会像以前一样重定向,在本例中返回null。这不是真正的mvc,但它是有效的。你也可以绘制路线图。所以,如果你想正确地绘制一条路线,如果你需要一个快速的n脏的解决方案,就返回null。这似乎非常有效。有人对这种方法有任何问题吗?这几乎是完美的,但RedirectResult操作返回的HTTP状态代码为302(暂时移动),您可能需要HTTP 303(参见其他)或307(临时重定向)。也许没什么大不了的,大多数浏览器都会将302解释为303:)你可以编写一个自定义的重定向结果来设置状态代码,如这里所述-@MattDavey:MVC 3中的RedirectResult有一个可选参数来使重定向成为临时(302)或永久(301)。是的,这是我想到的
public string GetCurrentUserName()
{
    if (!authenticated)
    {
        Response.Redirect(LoginScreen);

        throw new UnresolvedMethodException();
    }
    else
    {
        return UserName;
    }
}