Positonic
Positonic

Reputation: 9411

Not all paths return a value. - Optional return?

I am getting the error "Not all paths return a value", and I totally understand why.

As you can see I want to redirect the person isn't logged in, and obviously there is no return view.

I'm sure I'm going about this incorrectly. How should I be trying to do this?

    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 });
        }


    }

Please note that I need to redirect to a classic ASP page, not an MVC action..

Upvotes: 3

Views: 1666

Answers (5)

Polity
Polity

Reputation: 15130

Well, this is a good question actually. See dknaack's answer for a solution in your particular case however in other circumstances we might not be so lucky.

Technically this situation is very logical. Redirect just opens up a new request and either lets the current request handle itself nicely or forcefully close itself. In all cases the current method needs a return value. If Redirect lets the current process handle itself nicely meaning you should have a return value that makes sense.

I think one solution would be to throw a specific exception after the redirect. Something like:

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

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

Returning NULL is an option i wouldnt put my money on since NULL might also mean that there is no UserName Set (in the above case, a user might login using his email making the username optional).

Upvotes: 0

hcb
hcb

Reputation: 8357

Just put return null; under Response.Redirect(url); It will never actually reach that position, but it will get rid of the compiler error.

Upvotes: -2

devdigital
devdigital

Reputation: 34359

You could return a RedirectResult - http://msdn.microsoft.com/en-us/library/system.web.mvc.redirectresult.aspx

Upvotes: 3

GeirGrusom
GeirGrusom

Reputation: 1019

You could return null and check for that.

edit: I was way to quick, ignore me :P

Upvotes: -3

dknaack
dknaack

Reputation: 60506

You must return a ActionResult. Use "RedirectToAction".

    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";
            return RedirectToAction(<YOUR ACTION>);


        }
        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 });
        }


    }

Upvotes: 4

Related Questions