Який спосіб передачі даних на головну сторінку (за допомогою ASP.NET MVC) без порушення правил MVC?
Особисто я вважаю за краще кодувати абстрактний контролер (базовий контролер) або базовий клас, який передається всім переглядам.
Який спосіб передачі даних на головну сторінку (за допомогою ASP.NET MVC) без порушення правил MVC?
Особисто я вважаю за краще кодувати абстрактний контролер (базовий контролер) або базовий клас, який передається всім переглядам.
Відповіді:
Якщо ви віддаєте перевагу вашим представленням сильно набраних класів даних перегляду, це може вам підійти. Інші рішення, ймовірно, більш правильні, але це приємний баланс між дизайном та практичністю IMHO.
Основна сторінка приймає сильно набраний клас даних перегляду, що містить лише релевантну їй інформацію:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Кожен перегляд, що використовує цю головну сторінку, приймає сильно набраний клас даних перегляду, що містить його інформацію та походить від даних перегляду головних сторінок:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Оскільки я не хочу, щоб окремі контролери нічого знали про збирання даних головних сторінок, я інкапсулюю цю логіку на фабрику, яка передається кожному контролеру:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
Спадщина відповідає майстру, щоб добре переглядати відносини, але коли мова заходить про надання реквізитів / елементів керування користувачами, я складу їх дані перегляду в дані перегляду сторінок, наприклад
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Це лише приклад коду і не призначений для компіляції як є. Розроблений для ASP.Net MVC 1.0.
Я вважаю за краще розбивати керовані даними фрагменти головного виду на партії та рендерінг їх за допомогою Html.RenderAction . Це має ряд чітких переваг перед підходом до успадкування популярної моделі перегляду:
EDIT
Загальна помилка дала кращу відповідь нижче. Прочитайте, будь ласка!
Оригінальний відповідь
Microsoft фактично розмістила запис про "офіційний" спосіб вирішення цього питання. Це забезпечує поетапне ознайомлення з поясненням їх міркувань.
Коротше кажучи, вони рекомендують використовувати абстрактний клас контролера, але подивіться самі.
Я провів кілька досліджень і натрапив на ці два сайти. Можливо, вони могли б допомогти.
ASP.NET MVC Порада №31 - передача даних на головні сторінки та елементи керування користувачами
Я вважаю, що загальний батьківський зв'язок для всіх модельних об'єктів, які ви передаєте представленням, є надзвичайно корисним.
Завжди завжди є деякі загальні властивості моделі між сторінками.
Об'єкт Request.Params змінюється. Додавати до нього скалярні значення досить просто, як частину циклу обробки запитів. З точки зору цієї точки зору, ця інформація могла бути надана у запиті POSTSTER або FORM POST. hth
Я маю на увазі, що ще одним хорошим способом може бути створення інтерфейсу для перегляду з якоюсь властивістю, наприклад ParentView деякого інтерфейсу, тому ви можете використовувати його як для елементів керування, які потребують посилання на сторінку (батьківський контроль), так і для головних представлень, до яких слід отримати доступ поглядів.
Іншим рішенням не вистачає елегантності і потрібно занадто довго. Прошу вибачення за те, що роблю цю дуже сумну і збіднілу річ майже цілий рік пізніше:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
Так чітко я маю цей статичний метод Get () на SiteMasterViewData, який повертає SiteMasterViewData.