2011-10-20 9 views
3

"すべてのパスが値を返すわけではありません"というエラーが表示されています。すべてのパスが値を返すわけではありません。 - オプションの返品ですか?

私は、人がリダイレクトしたいと思うので、ログインしていないことがわかりましたが、明らかにリターンビューはありません。

私はこれについて間違っていると確信しています。どのように私はこれをしようとする必要がありますか?

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


    } 

は、あなたがのActionResultを返す必要があります

+0

+1「これは間違っていると確信しています。」 – MattDavey

答えて

3

あなたがRedirectResultを返すことができます - http://msdn.microsoft.com/en-us/library/system.web.mvc.redirectresult.aspx

+0

これは完全に機能するようです。誰でもこのアプローチに問題がありますか? – iKode

+0

これはほぼ完璧ですが、RedirectResultアクションはHTTPステータスコード302(一時的に移動)を返します.HTTP 303(その他参照)または307(一時リダイレクト)が必要な場合があります。大したことではないかもしれませんが、大部分のブラウザは303を303と解釈します:) – MattDavey

+1

ここで説明するように、ステータスコードを設定するカスタムRedirectResultを書くことができます。http://thethoughtfulcoder.com/blog/62/Away-to- return-a-permanent-301-redirect-result-in ASPNET-MVC-RedirectResult-return-a-temporary-302-redirect – devdigital

4

..私は古典的なASPページではなく、MVCのアクションにリダイレクトする必要があることに注意してください。 "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 }); 
     } 


    } 
+0

+1しかし、手動URL操作を削除することもできます.. – MattDavey

+0

@dknaack - 答えてくれてありがとう。私は古典的なaspログインページにリダイレクトするので、この場合RedirectToActionを行うことはできません.... – iKode

+0

@iKode、それは少し複雑です。その場合は、MVCエンジンがスキップするように、古典的なASPログインページに経路をマップする必要があります。 – MattDavey

-3

nullを返してそのことを確認できます。

編集:私は迅速に方法だった、私を無視:P

-2

はちょうどそれが実際にその位置に到達することはありませんResponse.Redirect(url);return null;を置くが、それは取り除くうコンパイラエラー。

+0

他の回答を見て、nullを返すのはきれいではない – Onkelborg

+0

それはちょうど真実ではありません。 Nullは、初期化されていないオブジェクトのデフォルト値です。危険なのは、初期化されたオブジェクトを実際の値なしで使用することです。 – hcb

+1

@hcb意味論を考えて、* MVCコントローラのアクションがnullを返すとき、それはどういう意味ですか? – MattDavey

0

これは実際には良い質問です。特定のケースでの解決策については、dknaackの答えを参照してください。ただし、他の状況では、それほど幸運ではないかもしれません。

技術的には、この状況は非常に論理的です。リダイレクトは新しいリクエストを開き、現在のリクエストをうまく処理するか、強制的に閉じることができます。すべての場合、現在のメソッドは戻り値を必要とします。リダイレクトが現在のプロセス自体をうまく処理できるようにする場合は、意味のある戻り値が必要です。

リダイレクト後に特定の例外をスローすることが1つの解決策だと思います。何かのように:返すNULL iはNULLにも設定されていないユーザー名が存在しないことを意味する可能性があるために私のお金を入れwouldntはオプションです

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

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

(上記の場合は、ユーザーは任意のユーザー名を作る彼の電子メールを使用してログイン可能性があります) 。

+0

UnresolvedMethodExceptionは私自身のクラスですので、 – iKode

+0

ええ、私は思いつきました。 – Polity

関連する問題