Ignia.Topics.Web.Mvc
Rakitan Ignia.Topics.Web.Mvc
menyediakan implementasi OnTopic untuk digunakan dengan ASP.NET MVC 5.x Framework.
Ada tiga komponen kunci di jantung implementasi MVC.
MvcTopicRoutingService
: Ini adalah implementasi nyata dari ITopicRoutingService
yang menerima informasi kontekstual tentang permintaan tertentu (dalam hal ini, URL dan data perutean) dan kemudian menggunakannya untuk mengambil Topic
saat ini dari ITopicRepository
.TopicController
: Ini adalah contoh pengontrol default yang dapat digunakan untuk jalur topik apa pun . Ini akan secara otomatis memvalidasi bahwa Topic
ada, tidak dinonaktifkan ( IsDisabled
), dan akan menerima pengalihan apa pun (misalnya, jika atribut Url
diisi). Jika tidak, ia akan mengembalikan TopicViewResult
berdasarkan model tampilan, nama tampilan, dan tipe konten.TopicViewEngine
: TopicViewEngine
dipanggil setiap kali tampilan diminta. Ia bekerja bersama dengan TopicViewResult
untuk mengidentifikasi tampilan MVC yang cocok berdasarkan lokasi dan konvensi yang telah ditentukan. Hal ini dibahas di bawah. Ada enam pengontrol utama yang dikirimkan bersama implementasi MVC. Selain TopicController
inti, ini mencakup pengontrol tambahan berikut:
ErrorControllerBase<T>
: Memberikan dukungan untuk tindakan Error
, NotFound
, dan InternalServer
. Dapat menerima IPageTopicViewModel
apa pun sebagai argumen umum; yang akan digunakan sebagai model tampilan.FallbackController
: Digunakan di Pabrik Pengontrol sebagai cadangan, jika tidak ada pengontrol lain yang dapat menerima permintaan tersebut. Cukup kembalikan NotFoundResult
dengan pesan yang telah ditentukan sebelumnya.LayoutControllerBase<T>
: Memberikan dukungan untuk menu navigasi dengan secara otomatis memetakan tiga tingkatan teratas dari namespace saat ini (misalnya, Web
, anak-anaknya, dan cucu-cucunya). Dapat menerima INavigationTopicViewModel
apa pun sebagai argumen umum; yang akan digunakan sebagai model tampilan untuk setiap instance yang dipetakan.RedirectController
: Menyediakan tindakan Redirect
tunggal yang dapat diikat ke rute seperti /Topic/{ID}/
; ini memberikan dukungan untuk URL permanen yang tidak bergantung pada GetWebPath()
.SitemapController
: Menyediakan tindakan Sitemap
tunggal yang mengembalikan referensi ke ITopicRepository
, sehingga memungkinkan tampilan peta situs berulang di seluruh grafik Topik, termasuk semua atribut.Catatan: Tidak ada cara praktis bagi MVC untuk menyediakan perutean untuk pengontrol generik. Oleh karena itu, ini harus disubkelaskan pada setiap implementasi. Pengontrol turunan tidak perlu melakukan apa pun selain menyediakan referensi tipe tertentu ke basis generik.
Secara default, OnTopic mencocokkan tampilan berdasarkan ContentType
topik saat ini dan, jika tersedia, View
.
Ada beberapa cara untuk mengatur tampilan. TopicViewResult
akan secara otomatis mengevaluasi tampilan berdasarkan lokasi berikut. Yang pertama cocok dengan nama tampilan yang valid dipilih.
?View=
parameter string kueri (misalnya, ?View=Accordion
)Accept
header (misalnya, Accept=application/json
); akan memperlakukan segmen setelah /
sebagai kemungkinan nama tampilanView
atribut (yaitu, topic.View
)ContentType
(yaitu, topic.ContentType
) Untuk setiap aturan Pencocokan Tampilan di atas, TopicViewEngine
akan mencari lokasi berikut untuk tampilan yang cocok:
~/Views/{ContentType}/{View}.cshtml
~/Views/ContentTypes/{ContentType}.{View}.cshtml
~/Views/ContentTypes/{ContentType}.cshtml
~/Views/Shared/{View}.cshtml
Catatan: Setelah mencari setiap lokasi ini untuk setiap aturan Tampilan Pencocokan, kontrol akan diserahkan ke
RazorViewEngine
, yang akan mencari lokasi default siap pakai untuk ASP.NET MVC.
Jika topic.ContentType
adalah ContentList
dan header Accept
adalah application/json
maka TopicViewResult
dan TopicViewEngine
akan berkoordinasi untuk mencari jalur berikut:
~/Views/ContentList/JSON.cshtml
~/Views/ContentTypes/ContentList.JSON.cshtml
~/Views/ContentTypes/JSON.cshtml
~/Views/Shared/JSON.cshtml
Jika tidak ditemukan kecocokan, maka header Accept
berikutnya akan dicari. Pada akhirnya, jika tidak ditemukan kecocokan pada berbagai aturan View Matching, maka yang berikut ini akan dicari:
~/Views/ContentList/ContentList.cshtml
~/Views/ContentTypes/ContentList.ContentList.cshtml
~/Views/ContentTypes/ContentList.cshtml
~/Views/Shared/ContentList.cshtml
Di global.asax.cs
, komponen berikut harus didaftarkan di bawah event handler Application_Start
:
ControllerBuilder.Current.SetControllerFactory(new OrganizationNameControllerFactory());
ViewEngines.Engines.Insert(0, new TopicViewEngine());
Catatan: Nama pabrik pengontrol dapat berubah-ubah, dan harus mengikuti konvensi yang sesuai untuk situs tersebut. Ignia biasanya menggunakan
{OrganizationName}ControllerFactory
(misal,IgniaControllerFactory
), namun OnTopic tidak perlu mengetahui atau peduli apa namanya; yaitu antara aplikasi Anda dan ASP.NET MVC Framework.
Saat mendaftarkan rute melalui RouteConfig.RegisterRoutes()
(biasanya melalui kelas RouteConfig
), daftarkan rute untuk rute OnTopic mana pun:
routes.MapRoute(
name: "WebTopics",
url: "Web/{*path}",
defaults: new { controller = "Topic", action = "Index", id = UrlParameter.Optional, rootTopic = "Web" }
);
Catatan: Karena OnTopic bergantung pada nama jalur wildcard, rute baru harus dikonfigurasi untuk setiap namespace root (misalnya,
/Web
). Meskipun OnTopic dapat dikonfigurasi untuk mengevaluasi semua jalur, hal ini mempersulit pendelegasian kontrol ke pengontrol dan penangan lain, bila diperlukan.
Karena OnTopic bergantung pada injeksi konstruktor, aplikasi harus dikonfigurasi di Root Komposisi — dalam kasus ASP.NET MVC, itu berarti pabrik pengontrol khusus. Struktur dasarnya mungkin terlihat seperti:
var connectionString = ConfigurationManager.ConnectionStrings["OnTopic"].ConnectionString;
var sqlTopicRepository = new SqlTopicRepository(connectionString);
var cachedTopicRepository = new CachedTopicRepository(sqlTopicRepository);
var topicViewModelLookupService = new TopicViewModelLookupService();
var topicMappingService = new TopicMappingService(cachedTopicRepository, topicViewModelLookupService);
var mvcTopicRoutingService = new MvcTopicRoutingService(
cachedTopicRepository,
requestContext.HttpContext.Request.Url,
requestContext.RouteData
);
switch (controllerType.Name) {
case nameof(TopicController):
return new TopicController(sqlTopicRepository, mvcTopicRoutingService, topicMappingService);
case default:
return base.GetControllerInstance(requestContext, controllerType);
}
Untuk templat referensi lengkap, termasuk pengontrol tambahan, lihat Intisari OrganizationNameControllerFactory.cs
.
Catatan:
TopicController
default akan secara otomatis mengidentifikasi topik saat ini (misalnya berdasarkan URL), memetakan topik saat ini ke model tampilan yang sesuai (berdasarkan konvensiTopicMappingService
), dan kemudian mengembalikan tampilan yang sesuai (berdasarkan konvensi tampilan). Untuk sebagian besar aplikasi, ini sudah cukup. Namun, jika aturan pemetaan khusus atau logika presentasi tambahan diperlukan, pelaksana dapat membuat subkelasTopicController
.