ASP.NET MVC 2 - Как правильно переключать представления в зависимости от контекста модели? - PullRequest
3 голосов
/ 08 апреля 2011

Я собираю свое первое приложение 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);
}

Это быстро и кажется грязным, но пока я не научусь чему-то лучше ... спасибо!

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Соглашение о конфигурации (новое жесткое кодирование), что-то простое:

public ActionResult Step(int stepNo, int id)
{
    var batch = BatchRepository.Batch.SelectById(id);
    var records = BatchRepository.Data.SelectForBatch(batch);
    return View("Type"+batch.BatchType+"Step"+stepNo, records);    
}
1 голос
/ 08 апреля 2011

Вам не нужны операторы switch. Создайте папку DisplayTemplates или EditorTempaltes в соответствующем месте, например Views / Shared /, и создайте файлы YourRecordType.cshtml, а затем измените оператор return, чтобы он просто возвращал модель. Например

-View
 -Shared
  -DisplayTemplates
   -MyRecordTypeA.cshtml
   -MyRecordTypeB.cshtml

return View(records)

Надеюсь, это поможет.

...