2017-05-23 27 views
0

私はMVCに慣れています。ASP.Netルーティングの問題

domain/{action} 
domain/{username}/{action} 
domain/{username} 

(ユーザー名は、IDの代わりになる) 同じコントローラは、3つのすべてのために使用されます。ここでは

は、私は私のルートが設定する方法です。

私はすべての3つを入力した場合、それはここで私

のページをロードする必要があり、私がもともと持っているものです。それは動作しません。私にはリンクを作成するURL.Actionメソッドがあり、それらを適切に作成しません。私は順序を入れ替えようとしましたが、問題はまだ残っています。つまり、ルーティングについて概念的に何か不足しています。ここで

は、私はもともと

routes.MapRoute(
    "WithUsername","{username}", 
    new { controller = "Home", action = "Landing"} 
); 
routes.MapRoute(
    "WithOutUsername", 
    "{action}", 
    new { controller = "Home", action = "Landing"} 
); 

routes.MapRoute(
    "Default", 
    "{username}/{action}", 
    new {controller = "Home", action = "Landing"} 
); 

誰もが正しい方向に私を引き起こす可能性を持っていたものでしょうか?

リンクがどのように乱されているかの例です。 URLをクリックして私をLearning Resourcesに連れて行くとしよう。 URL.ActionはLearning Resourcesアクションを指します。重複する名前はありません。ここで

は、私はこの

domain/LearningResources?username=LearningResources 

はどういうわけか、それがあっても、ユーザ名としてLearningResourcesを検出し得るURL.Action

<a href="@Url.Action(title.actionName, title.controllerName, new {Model.username})">@title.name</a> 

代わりのこの

domain/LearningResources 

を得ていますユーザー名はありません。私のすべてのアクションはオプションのパラメータ(username = ""という文字列として設定されている)としてusernameを取ります。そのため、ユーザ名とアクションは混乱しているようです。意図されました。

私は自分のアドレスとして最初にドメインを使用すると、それだけがうんざりするようです。私がdomain/{action}またはdomain/{username}で始めると、すべてのリンクがそれに応じて動作します。

ドメインだけがドメイン/ {アクション}になるようにドメインを再ルーティングすることはできますか?

+2

はい、ルーティングに関する基本的なものがありません - 「なぜasp.net mvcの共通ルートの前に特別なルートをマップするのですか」(https://stackoverflow.com/a/35674633/181087)を参照してください。 MVCではURL {{ユーザー名}}と{アクション}の違いは1つのセグメント変数であるため区別できません。それらを区別するためのものが必要です(ルート制約やリテラルURLセグメントなど)。 – NightOwl888

+0

こんにちは、ありがとう。最初の投稿に詳細を追加しました。私はあなたが私に与えた記事を見ていきます。 – lettuceman44

+0

@ lettuceman44あなたもアクションを追加できますか? – Usman

答えて

0

だから、これに対する解決策は非常に簡単です。ヘルプのNightOwl888に感謝します。

1つは、ユーザー名は常に "word.word"の形式であることです。アクションはそれには時間がないので、Regexを使用してそれをチェックし、それに応じて経路を決めることができます。

第2に、アクションへの特定のルートを設定することができます。私は2つの異なるコントローラを持っていると言うことができますが、私はまだ同じ機能を持っていると思います。 URLにコントローラがなければ、MVCが私が指しているコントローラを自動的に知る方法はありません。

私が見つけた解決策は、アクションの特定のルートを作成することです。だから、

私はリソースと呼ばれる作用を有し、かつそのNotHomeと呼ばれるコントローラで、私は私のルートは、このように見せることができた場合:

routes.MapRoute(
    "Resources", 
    "{username}/Resources", 
    new { controller = "NotHome", action = "Resources"} 
); 

だから今、私は何でも/リソースを入力するたびに、それがされますそのルートを打つ。