2016-05-27 10 views
1

ログインセクションを作成しようとしています。最初にページを起動すると、指定したURLの/Loginに移動します。あなたが提出し、資格が間違っている場合、私は指定されたURL /Login/Error/{errorid}でログインページにリダイレクトしたいと思います。 erroridパラメータがルートに追加されるたびにエラールートに入るはずです。それ以外の場合はデフォルトルートを使用します。ASP.NETパラメータに応じて特定のマップされたルートを経由してリダイレクト

しかし私は以下のルートを設定しましたが、動作していないようです。注:私はデフォルトコントローラーを少し変更しました。

routes.MapRoute("Error", "{action}/Error/{errorid}", 
    new { controller = "Login", action = "Login" } 
); 

routes.MapRoute("Default", "{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

さらに2つのコントローラがあります。 My Homeコントローラは、ランディングページとログインコントローラの場所です。

アプリケーションを起動するときにもエラーが発生します。インデックスアクションのリダイレクトを実行すると、次のように表示されます。

ルートテーブルのルートが指定された値と一致しません。

にHomeController:

public ActionResult Index() 
{ 
    Session["User"] = -1; 

    return RedirectToAction("Login", "Login"); 
} 

LoginController:

public ActionResult Login(int? errorid) 
{ 
    if (Models.User.CheckActiveSession(Convert.ToInt32(Session["User"]))) 
    { 
     return RedirectToAction("Overview", "Home"); 
    } 

    return View(); 
} 

public ActionResult ValidateLogin() 
{ 
    if (Request.HttpMethod == "POST") 
    { 
     int userid = Models.User.CheckLogin(Request.Form["username"], Request.Form["password"]); 

     if (userid != -1) 
     { 
      Session["User"] = userid; 

      return RedirectToAction("Overview", "Home"); 
     } 
    } 

    return RedirectToAction("Login", "Login", new { errorid = 1 }); 
} 

は、私は私がすべてで、これは正しいやっている場合ので、私はわからないんだけど、これに新しいですと言って持っています私はあなたがこれをどうやってできるかについていくつかのガイドを読んだ。任意のヒントが評価されます。あなたがこれを行うことができる他の方法があるなら、私はそれらもまた聞くのが大好きです。

編集:

カスタムルート内で小さな間違いがありました。 erroridパラメーターは、デフォルトパラメーターのオブジェクトにありません。もし私がerrorid = 0と言うなら、ページはロードされますが、私はURL /Login/Errorを見ます。

+0

また、エラー番号の適切な本文を条件付きで表示するために 'login/error'ビューをコーディングすることもできます。できるだけルーティングテーブルをあまりカスタマイズしない方が良い理由はたくさんあります。カスタムルートを使用するのが間違っていると言っているわけではありません。カスタムルート以外のものを使用する可能性があるユースケースもあります。あなたがカスタムルートにあまりにも頼っているなら、すぐに維持するのが難しいことがわかります。 –

+0

申し訳ありませんが、インデックスページのログインページへの最初のルートが失敗する理由を知っているかもしれません。エラールートが機能しない場合、なぜデフォルトルートを使用しませんか? – Thodor12

答えて

1

問題はデフォルトルートである:

routes.MapRoute("Default", "{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

あなたは何も値がURLで提供されていない場合"Home"のデフォルトcontroller価値を提供するために、指定したが、あなたが{controller}を提供する方法を含めていませんURL。つまり、controllerには"Home"以外のものを指定する方法はありません。つまり、このデフォルトルートを使用する場合は、LoginControllerにアクセスする方法はありません。

元のURLの{controller}/{action}/{id}に戻ることを含む多くの方法がありますが、最初はURLからコントローラを削除する理由に依存します。

カスタムルート内に小さな間違いがありました。 erroridパラメーターは、デフォルトパラメーターのオブジェクトにありません。 errorid = 0の場合、ページはロードされますが、URLは/Login/Errorと表示されます。

これはエラーではありません。 URLに必要な値を設定する場合は、デフォルト値を指定しないでください。それ以外の場合はオプションです(URLの右側に置いてください)。

Errorと一致するURLを生成するには、erroridの値を指定する必要があります(オプションではないため)。

return RedirectToAction("Login", "Login", new { errorid = 123 }); 
+0

ありがとうございました。しかし、もう1つ知りたいです。私は{コントローラ}をデフォルトルートに戻しましたが、現在はログインページに行くたびにURL /ログイン/ログインを取得します。これはちょっとばかげているようですが、これに関する勧告はありますか? – Thodor12

+0

urlの値が 'login'で、デフォルト値が' new {controller = "Login"、action = "Login"} 'のログインルートを挿入することができます。あるいは、属性ルーティングを使用します。しかし、私は、コントローラとアクションのために別の名前を使用することをお勧めし(「ログイン」からそれらの1つを変更)ので、あなたは自分自身を混乱や他の誰がこのコードを維持して終了しません。 – NightOwl888

+0

さてさて、私はちょうどより適切なものにコントローラ名を変更しました。ご協力いただきありがとうございます。 – Thodor12

関連する問題