Логика контроллера для отображения / пропуска представления на основе выбора в предыдущем представлении (с помощью мастера) - PullRequest
0 голосов
/ 03 апреля 2012

Я не могу правильно понять логику для этого. Я использую мастер с отдельными представлениями в контроллере (без JavaScript). Основываясь на выборе в шаге 2 мастера, я хочу пропустить шаг 7 или показать шаг 7. Мастер использует кнопки «Далее» / «Назад» для управления тем, куда идти.

Мне удалось «показать» Шаг 7, если пользователь выбрал «A» (например), но когда я создал логику, чтобы пропустить Шаг 7, если были выбраны «B» или «C», я либо получил «» Ошибка перенаправления / слишком много перенаправлений »в Chrome (я удалил файлы cookie безрезультатно), или кнопка« Далее »на предыдущем шаге не будет работать (она просто показывает то же представление).

Шаг 2 сам по себе не важен с точки зрения контроллера, он содержит раскрывающийся список с тремя вариантами выбора, и в зависимости от этого выбора у меня есть код контроллера (я опускаю сериализацию кода myViewModel в Контроллер, который украшен [Serializable]):

    // STEP 6:
    // Based on selection in Step 2, show or don't show Step 7
    public ActionResult Step6(string backButton, string nextButton)
    {
        if (backButton != null)
            return RedirectToAction("Step5");
        else if ((nextButton != null) && 
            ModelState.IsValid && 
            (myVieModel.MyModel.MyDropDown == 
            MyNamespace.Models.MyModel.MyEnum.A))
            return RedirectToAction("Step7");
        else if ((nextButton != null) && 
            ModelState.IsValid && 
            (myVieModel.MyModel.MyDropDown == 
            MyNamespace.Models.MyModel.MyEnum.B) || 
            (myVieModel.MyModel.MyDropDown == 
            MyNamespace.Models.MyModel.MyEnum.C))
            return RedirectToAction("Step8");
        else
            return View("Step6", myViewModel);
    }

    // STEP 7:
    // Only shown if Choice in MyDropDown is "A", 
    // otherwise if "B" or "C" skipped
    public ActionResult Step7(string backButton, string nextButton)
    {
        if (backButton != null)
            return RedirectToAction("Step6");
        else if ((nextButton != null) && 
            ModelState.IsValid)
            return RedirectToAction("Step8");
        else
            return View("Step7", myViewModel);
    }

    // STEP 8:
    // Arrive here either from Step 6 
    // (if "B" or "C" chosen),
    // or from Step 7 (if "A" chosen)
    public ActionResult Step8(string backButton, string nextButton)
    {
        if ((backButton != null) && 
            (myVieModel.MyModel.MyDropDown == 
            MyNamespace.Models.MyModel.MyEnum.A))
            return RedirectToAction("Step7");
        else if ((backButton != null) && 
            (myVieModel.MyModel.MyDropDown == 
            MyNamespace.Models.MyModel.MyEnum.B) ||
            (myVieModel.MyModel.MyDropDown == 
            MyNamespace.Models.MyModel.MyEnum.C))
            return RedirectToAction("Step6");
        else if ((nextButton != null) && 
            ModelState.IsValid)
            return RedirectToAction("Step9");
        else
            return View("Step8", myViewModel);
    }

Я знаю, что просто неправильно понимаю логику. Любая помощь очень ценится.

Приведенный выше код (без логики, о которой я спрашиваю) отлично работает, как и код, который я использую для отображения DropDown.

1 Ответ

0 голосов
/ 03 апреля 2012

Тьфу, мне следовало бы инкапсулировать логику || в ее собственную (), чтобы прочитать таким образом:

else if ((backButton != null) && 
    //Extra opening parenthesis-->
    ((myVieModel.MyModel.MyDropDown == 
    MyNamespace.Models.MyModel.MyEnum.B) ||
    (myVieModel.MyModel.MyDropDown == 
    MyNamespace.Models.MyModel.MyEnum.C))) //<--extra closing parenthesis
    return RedirectToAction("Step6");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...