Я собираю свое первое приложение MVC и задаю вопрос о том, как правильно выполнить мою цель. Вот что я пытаюсь ...
В одной области моего приложения представлен список пакетов данных, список Batch
объектов. Для каждого Batch
пользователь может выбрать обработать своих данных. Обработка состоит из набора шагов, которые я представлю пользователю в виде цепочки представлений, подобной мастеру.
Каждый Batch
имеет тип. Пакет A типа L может состоять из записей X, а Пакет B типа M может состоять из записей Y. Шаги в мастере изменятся незначительно в зависимости от типа пакета. Чего я не хочу делать, так это (очевидно, плохой код, только для иллюстрации):
ProcessController
public ActionResult StepOne(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
switch (batch.BatchType)
{
case "X":
return View("TypeXStepOne", records);
case "Y":
return View("TypeYStepOne", records);
default:
return View();
}
}
public ActionResult StepTwo(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
switch (batch.BatchType)
{
case "X":
return View("TypeXStepTwo", records);
case "Y":
return View("TypeYStepTwo", records);
default:
return View();
}
}
...
И так далее. Это кажется плохой практикой, и, поскольку мой мастер может выполнять 4 или 5 шагов, и в настоящее время у меня есть три разных типа пакетов, объем кода в этих действиях становится сложно поддерживать.
Что MVC может сделать для меня с точки зрения управления этим? Я хотел бы минимизировать объем требуемой работы, если, например, введен четвертый тип.
Я знаю, что, вероятно, у меня будет:
- Частичный вид для каждого типа партии
и шаг в мастера, есть
на самом деле никакого пути к этому нет, хотя некоторые частичные представления могут быть общими.
Итак, было бы лучше для каждого типа партии иметь выделенный контроллер? Я полагаю, что тогда я мог бы сделать что-то вроде этого, где тип пакета становится именем контроллера.
BatchController
public ActionResult Process(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
return RedirectToAction("StepOne", batch.BatchType, new { id = batch.Id });
}
Но это будет зависеть от того, какое имя типа пакета соответствует имени контроллера, и мне это тоже не обязательно нравится. Обновление : Или, в худшем случае, у меня есть один оператор switch с моими тремя типами пакетов, а затем я могу переслать на соответствующий контроллер.
Итак ... идеи! Я нуждаюсь в них. И я не настолько далеко в этом, что я не могу начать что-то новое, я просто подбрасываю идеи в голову как новичок MVC. В MVC должно быть что-то, что позволяет динамическое переключение видов в зависимости от контекста, будь то с помощью причудливой техники маршрутизации, ViewFactory или какой-то другой хитрости.
Любая обратная связь будет принята с благодарностью!
И просто для всех, кто интересуется, я застрял на .NET 3.5 и IIS6, поэтому я вернулся на MVC 2 вместо 3.
UDPATE
Вот к чему я сейчас катаюсь. Я разбил BatchController на несколько контроллеров - по одному для каждого типа пакета. Поскольку они в основном одинаковые, я создал реферат WizardController
, который имеет следующие методы:
public abstract ActionResult Step(int batchId, int stepNumber);
protected ViewResult ViewStep(int stepNumber, object model)
{
return View(string.Format("Process\Step{0}", stepNumber), model);
}
И в моем производном контроллере (-ах) что-то вроде:
public override ActionResult Step(int batchId, int stepNumber)
{
var data = BatchRepository.BatchType.SelectByBatchId(batchId);
return ViewStep(stepNumber, data);
}
Это быстро и кажется грязным, но пока я не научусь чему-то лучше ... спасибо!