簡體   English   中英

在ASP.net MVC中沒有控制器或操作的情況下在文件夾中顯示視圖

[英]Display View in folder without Controller or Action in ASP.net MVC

如果沒有控制器/動作匹配,我想在文件夾中顯示視圖。

例如www.site.com/Home/Index,如果我有正常的默認路由{controller} / {action} / {id},那么我需要一個帶有Index方法的HomeController。 而且在Views文件夾中有一個名為Home的文件夾,並且文件Index.cshtml

如果我嘗試www.site.com/About/Index,則需要創建AboutController和方法索引。 但是我只有文件夾About和文件Index.cshtml。

如果默認路由不匹配,但我希望在Views文件夾中有一個與模式匹配的Folder和File:{controller}是文件夾{action}是視圖; 然后顯示該視圖。

我怎么能這樣做?

對於缺少的動作,您可以覆蓋HandleUnknownAction

對於缺少的控制器,您可以實現一個自定義的DefaultControllerFactory並使用類似以下內容的方法重寫GetControllerInstance:

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {

   if (controllerType == null)
      return new DumbController();

   return base.GetControllerInstance(requestContext, controllerType);
}

class DumbController : Controller {

   protected override void HandleUnknownAction(string actionName) {

      try {
         View(actionName).ExecuteResult(this.ControllerContext);
      } catch (Exception ex) {
         throw new HttpException(404, "Not Found", ex);
      }
   }
}

最近,在開發AJAX Web應用程序時遇到了相同的問題,該應用程序的大多數頁面實際上不需要控制器(所有數據都是通過Web API調用返回的)。

數十個控制器全部通過一個動作返回視圖似乎效率不高,因此我開發了ControllerLess插件,該插件在幕后包含了一個默認的視圖控制器,並且只有一個動作。

如果為視圖創建控制器,則MVC將使用該控制器。 但是,如果您創建的視圖沒有控制器,則該請求將通過默認的插件控制器重新路由。

它可與C#和VB.NET一起使用,我們可從https://www.nuget.org/packages/ControllerLess獲得

源代碼也可以在GitHub上找到, 網址https://github.com/brentj73/ControllerLess

您不能也不應該以自己想要的方式。 無法通過設計解決視圖問題(在/ views文件夾中的web.config中,存在一個映射為*的HttpNotFoundHandler以確保實現此目的)

話雖這么說,您在這里想要的並不是真正的標准,所以為什么要這樣做,也許我們可以根據其背后的原因提出更好的建議?

從未嘗試過,但這是一個想法。 您可以為路線設置約束,因此應該可以創建與“ {folder} / {file}”匹配的路線,在其中將約束約束為有效值(可以將其谷歌搜索,也可以在SO上搜索),然后進行設置它可以通過一些默認操作在FileController(任意名稱)上運行。 然后,在該操作中,只需返回所需的視圖即可。 就像是:

public class FileController : Controller {
    public ActionResult Default(string folder, string file) {
        return View(folder + "/" + file);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM