Saturday, 21 September 2013

ControllerPathViewEngine - Structuring View Folders based on Controller Namespace Hierarchy in ASP.Net MVC

Introducing ControllerPathViewEngine

ControllerPathViewEngine is an ASP.Net MVC ViewEngine that allows you to structure your views in folders that match the namespaces of your controller, like this:



If you know about git, go ahead and clone the repository on your development machine, otherwise you can download a zip file of the source. If you just fancy a look around, you can browse the code directly on GitHub.

The Problem

One thing that has always annoyed me about ASP.Net MVC is the flat Views folder structure.

When an ASP.Net MVC controller action renders a view, the built-in view engines will, by default, expect your Views folder to be structured based on the following pattern:

Views/{controller name}/{action name}.{extension}

There's no support for structuring views in folders that relate to the namespaces of their related controllers.

In a simple project with a handful of controllers, this probably won't be a problem. However, on a larger project with a lot of controller code, you'll probably find yourself organising your controllers within a deeper namespace hierarchy.

A nested hierarchy makes a complex application manageable by providing an isolated context to the things it contains, keeping things focussed and easier to name. With the flat view structure we lose some of this context and it becomes difficult to relate view to controller.

And don't even think about having more than one controller with the same name! A flat views folder structure is going to lead to naming clashes, unrelated views sharing the same folder and all sorts of shenannigans.

ASP.Net MVC Areas could alleviate this to some extent by allowing you to group and manage related controllers, views and their related routes in a more modular fashion. They don't really solve the core problem though and using an area only adds a single level to your Views folder structure, based on the following default pattern:

Areas/{area name}/Views/{controller name}/{action name}.{extension}

The Solution

Anyway, that's enough moaning justification - writing the above has taken longer than it took to write the code!

A quick look at the ASP.Net MVC source code led me to an extremely simple solution. We simply intercept the call to FindView and FindPartialView and cheekily switch the folder path for the controller name during the call to the base implementation. This allows us to leverage the core caching and view finding functionality.

The project's README contains some background on implementation and the logic used to drive the view folder structure. See the code itself and unit tests to learn more about the implementation.

Alternatives

I had a quick look around at some other approaches, including this one. I had a couple of problems with this implementation however (in fairness to the writer of the post, the main intention was to demo view engine extensibility). Firstly, the cheesy %1 placeholder used in the view location format strings shows up in the exception thrown when a view cannot be located, which doesn't really help the developer work out which view file is missing. Secondly, I'm not sure that it would support the caching functionality that VirtualPathProviderViewEngine uses to optimise view retrieval when dealing with controllers with the name name (a bit of an edge-case but there's potential for a big WTAF there).

Hope you find this useful. Comments and suggestions are welcome as usual.










5 comments:

  1. Làm sao để gửi hàng đi miền tây? Nếu đây là điều bạn đang thắc mắc thì hãy đến với chúng tôi. Chúng tôi là công ty chuyên nhận vận chuyển hàng. Các dịch vụ của chúng tôi hiện đang được rất nhiều ủng hộ. Và đây là những dịch vụ tiêu biểu được nhiều sử dụng của chúng tôi: giao hàng nhanh, giao hàng nhanh tphcm, nhận ký gửi hàng hóa, dịch vụ giao hàng thu tiền cod, ship hàng nội thành, gửi hàng về miền tây, chuyển hàng về đà nẵng, dịch vụ chuyển hàng. Nếu bạn đang cần vận chuyển hay sử dụng dịch vụ giao hàng nội thành hãy liên hệ với chúng tôi nhé.

    ReplyDelete
  2. đồng tâm
    game mu
    cho thuê nhà trọ
    cho thuê phòng trọ
    nhac san cuc manh
    số điện thoại tư vấn pháp luật miễn phí
    văn phòng luật
    tổng đài tư vấn pháp luật
    dịch vụ thành lập công ty trọn gói
    64 nước cờ trên bàn thương lượng ebook
    mbp là gì
    thuyết erg
    các nghịch lý nổi tiếng
    chi square test là gì
    nghệ thuật nói chuyện trước công chúng dale carnegie
    định lý coase
    học thuyết kỳ vọng của victor vroom
    chiến thắng con quỷ trong bạn audio
    điểm cân bằng nash

    Cổ Tiểu Âu lúc này trông rất quyến rũ làm Triệu Quốc Đống khá động tâm.

    - Đùng chụp mũ to như vậy được không, chỉ cần đừng đòi tới Giả Nhật Hoa Viên hoặc Quân Duyệt thì một bữa ăn anh vẫn mời được.
    Triệu Quốc Đống gãi đầu rồi bất đắc dĩ nói:
    - Không công bằng, đòi anh một bữa cũng được, còn làm anh phải quỳ xuống cảm ơn vì được ân sủng ư?

    - Hừ, anh nghĩ rằng em không biết hai ông em của anh lãi lớn ở thị trường chứng khoán sao? Đức Sơn và Triệu Trường Xuyên bây giờ vẫn còn chưa về phải không?
    Cổ Tiểu Âu nhìn chằm chằm vào hắn rồi nói:
    - Hôm nay bọn em tới Giả Nhật Hoa Viên hoặc Quân Duyệt ăn trưa, anh tự chọn đi, các nơi khác em không đi.

    Triệu Quốc Đống đi Thượng Hải cũng không giấu Cổ Chí Thường. Cổ Chí Thường cũng nhắc Triệu Quốc Đống không nên quá si mê, thị trường chứng khoán chỉ nên thi thoảng tham gia mà thôi.

    - Bọn họ về rồi nhưng bây giờ đang ở Tân Châu, hôm qua vừa về An Đô.
    Triệu Quốc Đống giơ tay nhìn đồng hồ rồi nói:
    - Đi thôi, nếu muốn tới Giả Nhật Hoa Viên hoặc Quân Duyệt thì phải tới sớm chút. Anh đi lấy xe.

    - Quốc Đống ca, anh có xe à? Xe riêng hay xe công?
    Cổ Tiểu Âu vui vẻ nói.

    - Xe riêng thì tạm thời chưa có năng lực đó, xe công anh chỉ mượn tạm dùng thôi, đó là xe của Chủ nhiệm xinh đẹp của anh. Anh chưa đến mức có xe của riêng mình đâu.
    Triệu Quốc Đống nửa thật nửa giả mà nói.

    - Ồ, vừa người phụ nữ vừa đứng đó là lãnh đạo của anh sao? Nghe nói anh đi Thượng Hải lãi nhiều lắm mà, mua xe đi.
    Cổ Tiểu Âu thở dài một tiếng:
    - Bọn em đi thay đồ đã, bộ này còn phải giữ lại đến lễ bế mạc.

    - Lễ bế mạc cũng cần các em tham gia sao?
    Triệu Quốc Đống nói.

    - Hình như nghe nói có nghi thức quan trọng nào định công bố, có vẻ là ký tên gì gì đấy.

    ReplyDelete
  3. Điều kì diệu làm nên công dụng của thuốc Fucoidan trị ung thư của Mỹ chính là thành phần của nó. Fucoidan Fucoidan từ tảo nâu Nhật Bản được coi là nguồn Fucoidan tinh khiết và chất lượng cao. Fucoidan là gì Hợp chất sinh học này được phát hiện vào năm 1913, với tên gọi ban đầu là “Fucoidin”, Fucoidan Nhật Bản loại nào tốt sau được đổi thành “Fucoidan” theo nguyên tắc đặt tên quốc tế. thuốc Fucoidan giá
    Còn Agaricus là một loại nấm quý hiếm được sử dụng chủ yếu tại Nhật và Brazil. tác dụng của Fucoidan Nhờ những tác dụng vượt trội của nó đối với sức khỏe, người dân ví Agaricus là “nấm của Chúa”.

    ReplyDelete