2016-11-08 6 views
0

注:これは、最初のページが正常に動作するため、別の質問と重複しているわけではありません。MVCコントローラが原因で404エラーが検出されない

私はこれまでに多くの投稿を準備しており、近いものはありません。これは、開発ボックスでローカルに実行するとうまく動作します。私はサーバーにコピーした後、私は問題を参照してください。私のデフォルトルートは正常に動作し、予想されるインデックスページを取得します。

public ActionResult Index() 
{ 
    return View(); 
} 

私RouteConfigは含まれています。私はインデックス以外に到達したい場合

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

問題が発生します。たとえば、このアクションによって404が見つかりませんでしたエラーが発生します。

public ActionResult renderForm() 
{ 
    return PartialView("_formPanel"); 
} 

この場合も、ローカルのデベロッパーボックスに表示されているとおりに動作します。しかし、サーバー上で私は得る要求されたURL:/ AnnualFees/renderForm 404エラーリソースが見つかりません。


UPDATE

[OK]を、いくつかのより多くの研究と試行錯誤をして、私は何かを発見して追加するにはもう少しを持っています。

このアプリケーションはIISの現在のWebサイトで実行されています。そこで、Webサイトルートの下に仮想フォルダ/アプリケーションを作成しました。私がwww.mysite.com/AnnualFeesに移動すると、MVCアプリケーションの最初のページが期待どおりに取得されます。しかし、私がAnnualFeesControllerの他のアクションにアクセスできる唯一の方法は、動作するwww.mysite.com/AnnualFees/AnnualFees/renderFormのようなコントローラー名を2倍にする必要がありますが、醜いです。どのように私は冗長性を取り除くことができますか?

+0

[MVC Webサイトで404エラーを取得する](http://stackoverflow.com/questions/5068770/getting-404-error-on-mvc-web-site) –

+0

設定が必要ですIISが適切に現時点では、www.mysite.com/AnnualFeesはアプリケーションを参照し、コントローラを含むルート内のすべてのデフォルトを使用します。 "www.mysite.com/AnnualFees/AnnualFees"と同じ結果が得られます。必要なセットアップが見つかりました[ここ](http://serverfault.com/questions/68497/how-do-you-configure-iis-7-to-use-a-subdirectory-as-the-default-document) – Andrei

+0

@Andreiは、セットアップIISによって何を意味するのかよく分かりません。このアプリは既存のウェブサイトで実行する必要があるため、サイトの/ AnnualFeesサブフォルダ内で実行する必要があります。私は/ AnnualFeesがアプリのルートになる必要がありますが、それでもサイトの他のフォルダにあるファイルにアクセスする必要があります。 –

答えて

1

私はこのコメントで指摘したように、問題はあなたがフォルダを持っていて、その下にルートがあるということです。あなただけ

www.mysite.com/AnnualFees 

を呼び出して、ルートの任意の部分を、提供していない場合は、あなたのルートの設定で指定され、これはすべてのデフォルトを使用し、デフォルトのページを取得します。あなたは

www.mysite.com/AnnualFees/ActionName 

を入力するただし場合MVCコントローラのACTIONNAMEとノーアクションとして何のidが設けられていないことを見ています。これはあなたのアプリには存在しないので、エラーです。

ここでの根本的な問題は、ウェブサイトがフォルダの下に住んでいるとは考えられないことです。彼らはトップドメインの下に住むことになっています。つまり、サイトルートのURLがwww.mysite.com/AnnualFeesであるとは予想されません。ちょうどwww.mysite.comであるはずです。しかし、同じ名前のメインコントローラとIISフォルダを持たず、不要な複製を作成しても、それでも問題ありません。

ただし、AnnualFeesをデフォルトコントローラにするために経路を変更することはできます。

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

は今、あなたは上記URL「AnnualFees」でコントローラ名ではないことに注意して、再び

www.mysite.com/AnnualFees/ActionName 

を使用することができるはず、それは事実である:そうのように単純にコントローラの一部を除去MVCアプリケーションには何も表示されません。

ただし注意が必要です。別のコントローラを追加する必要があるとします。これで、デフォルトの唯一のルートは動作しません。キーは、このコントローラへのすべての要求が正しくルーティングされるように

routes.MapRoute(
    name: "NewControllerRoute", 
    url: "NewControllerName/{action}/{id}", 
    defaults: new { controller = "NewController", action = "Index", id = UrlParameter.Optional } 
); 

すると、デフォルトの1の前に、このルートを入れていることを確認し、ハードコード最初の部分で、このコントローラ用に別のルートを提供することであり、他のすべての要求が行きます"AnnualFees"に。

+0

これで、ツリーのフォレストが見えるようになりました。それはもっと意味をなさない...私は、サブフォルダ内にあるコントローラ内にあるメソッドを呼び出しています。だから私の見ているAnnualFeesは2回、フォルダー名のために、そしてコントローラ名のためにもう一度正しい。私はまた、ページが末尾にスラッシュで呼び出されたかどうかに起因する問題も見ていました。だから、今のところすべてが整理され、期待どおりに働いています。 –

関連する問題