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}.cshtmlCatatan: 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:
TopicControllerdefault 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.