2016-04-12 17 views
1

私はMVCが新しく、ASP.Net MVC5.Iを使用してウェブサイトを構築していますが、ルーティングコンセプトと少し混乱しています。以下は私が持っているroute.configファイルです。私のホームページやログインページにアクセスして資格情報を入力して[送信]ボタンをクリックすると、私は自分の情報を見つけることができる次のページに行くことができますが、URIは送信ボタンがトリガーされた後のアクション。例えば私のホームログインページURIは、URLを提出する上でクリックしたときに、このMVCルーティング - サブミットボタンをクリックするとURLが変更されます

http://localhost/Home/

ある

http://localhost/home/submitになりますが、私はロードビューは これがどのように動作するかわからないaccountInfoの呼び出された場合。

また、ユーザー情報をセッションに保存していますが、ログオフボタンがありますので、セッションをnullに設定してログイン操作にリダイレクトしますが、次にこのようなURLに変更されます。私はroute.configのURLの一部としてパラメータを持つURLは持っていませんが。

http://localhost/Home/Login?SourceSeqNo=0&SessionSeqNo=0&AsOfDate=4%2F12%2F2016&NumberOfContracts=0&NumberOfPassDueContracts=0

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
     name: "Test", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "TESTVIEW", id = 
     UrlParameter.Optional } 
     ); 

     routes.MapRoute(
     name: "Invoice", 
     url: "{Home}/{Invoice}/{q}", 
     defaults: new { controller = "Home", action = "GetInvoice", q = 
     UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Error", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Error", id = 
     UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "ResetPassword", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "ResetPassword", id 
     = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Accounts", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Home", action = "AccountStatus" } 
     ); 

     routes.MapRoute(
      name: "Register", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Register", id = 
     UrlParameter.Optional } 
     );       

     routes.MapRoute(
      name: "Home", 
      url: "Home", 
      defaults: new { controller = "Home", action = "Login"} 
     ); 
     routes.MapRoute(
      name: "Home1", 
      url: "", 
      defaults: new { controller = "Home", action = "Login" } 
     ); 

    } 

対処方法

/// <summary> 
    /// Logoffs this instance. 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult Logoff() 
    { 
     Session["AccountInfo"] = null; 
     //return View("Login"); 
     return RedirectToAction("Login", new CustomerModel()); // 
    View("Login", new CustomerModel()); 
    } 

提出する自分の行動には大きな好意になります

[ValidateAntiForgeryToken] 
    public ActionResult Submit(CustomerModel customerModel) 
    { 
     homeAccountViewModel = new HomeAccountStatusViewModel(); 
     homeAccountViewModel.Customer = customerModel;   

     if (ModelState.IsValidField("Username") && 
     (ModelState.IsValidField("Password"))) 
     { 
      logic here.... 

      return View("AccountStatus", homeAccountViewModel); 
     } 
     else 
     { 
      return View("Login", customerModel); 
     }    
    } 

すべてのヘルプを下回っています。あなたのアクションメソッドが実行されると感謝

+0

あなたの 'submit'アクションメソッドはどのように見えますか? – Shyju

+0

について: 'Session.Clear(); Session.Abandon(); '? – Hackerman

+0

投稿アクションメソッドを表示するように編集しました。 – Blossom

答えて

0

は、あなたが呼んでいる:

return RedirectToAction("Login", new CustomerModel()); 

これは、URLを構築するためにルートを使用します。発信ルートは、コントローラ、アクション、およびルート値を使用して一致するルートを検索します。

routes.MapRoute(
     name: "Register", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Register", id = 
    UrlParameter.Optional } 
    ); 

そして、上記のルートがルーティングを告げる:あなたのコントローラがHomeである(あなたが指定されていませんでしたので)、あなたがRegisterとしてアクションを指定している、このルートがマッチしますと仮定し、この場合には

、エンジンを使用して{controller}/{action}/{id}というURLを作成します。この場合、IDはオプションであるため、結果のURLから除外されます。

注:私はあなたのルーティングが完全誤って設定されていることを指摘していなかった場合、私は怠慢でしょう。ルーティングフレームワークは、着信ルートのための{controller}/{action}/{id}{Home}/{Invoice}/{q}の違いを認識できません。オプションの値を指定すると状況がさらに悪化します。最初の2つのルートはいずれものいずれかの URLと0,1,2または3つのセグメントが一致します。最初の試合は常に勝つので、2番目の(そしてほとんどの他のルート)には決して到達しません。

詳細については、Why map special routes first before common routes in asp.net mvc?を参照してください。

+0

答えをありがとう、私は私のルートで遊んだと私はあなたが言っていたものを考え出した。私のルートのどれもが何もパラメータを持っていないし、それらのすべてが同じパターンになるだろうと私は指定された多くのルートを持っている必要があると思うが、特定のルートのために私を悩ますことは少し疑うこれがコントローラであり、これがアクションであると言って、それが他のアクションをどのように呼び出すのでしょうか? – Blossom

+0

これはデフォルト値のためです。 1つ以上の変数をURLから取り出してリテラルセグメントを使用すると、URLはデフォルトから変更できません。私の[リンクされた答え](http://stackoverflow.com/questions/35661062/why-map-special-routes-first-before-common-routes-in-asp-net-mvc/35674633)をもう一度見てください。私はこのタイプの設定問題を修正する方法のオプションのリストを更新しました。 – NightOwl888

+0

そのリンクに感謝します。それは本当に助けになりました。 – Blossom

関連する問題