2016-11-08 97 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

好,做一些調查研究和反覆試驗,我發現了一些東西,有更多的補充。

此應用程序在IIS中的當前網站下運行,我在該網站的根目錄下創建了一個虛擬文件夾/應用程序。如果我導航到www.mysite.com/AnnualFees,我會按預期得到MVC應用程序的第一頁。但是,在我的AnnualFeesController中唯一可以進行其他操作的方法是,我必須將控制器名稱加倍,例如www.mysite.com/AnnualFees/AnnualFees/renderForm,但這很有用,但很醜陋,不太正確。我怎樣才能擺脫冗餘?

+0

[在MVC網站上獲取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 } 
); 

現在,你應該能夠使用

www.mysite.com/AnnualFees/ActionName 

同樣要注意的是,在上述網址「AnnualFees」不是一個控制器名稱,它實際上是MVC應用根本不可見。

然而,有一個警告。想象一下,你需要添加另一個控制器。現在默認和唯一的路線將無法使用它。關鍵是要提供這個控制器的獨立路線,用硬編碼的第一部分

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

確保默認的一個前把這個路線,讓這個控制器的所有請求被正確路由,所有的其他請求去到「AnnualFees」。

+0

好吧,現在我可以看到樹木的森林。現在它更有意義......我正在調用位於子文件夾中的控制器中的方法。所以我看到AnnualFees兩次是正確的,一次是文件夾名稱,然後是控制器名稱。我也看到問題,如果頁面被稱爲一個結尾的斜槓或不。所以,現在所有人都按照預期進行整理和工作。 –