Каков рекомендуемый шаблон для обработки логики отображения управления в ASP.NET MVC? - PullRequest
4 голосов
/ 21 мая 2011

Я просматриваю некоторые учебные пособия по MVC3, а именно видео о Pluralsight, и думаю о том, как будет работать наше существующее приложение, если оно будет перестроено на ASP.NET MVC (не в плане, но оно дает мнеточка зрения).У нас есть немного кода, который выглядит примерно так в наших кодах aspx:

if (SomeBooleanCheck){SomeControl.Visible = true;}else {SomeControl.Visible = false;}

Конечно, этот пример значительно упрощен, но предполагается, что логическая логика довольно сложна, и предполагается, что должно произойти несколько вещейкак часть создания элемента управления видимым (возможно, изменение цвета, размера, текста и т. д.), каков шаблон для этого в ASP.NET MVC?Похоже, что вам придется выполнить ту же самую логическую проверку в самом представлении, что мне кажется отчасти уродливым.Похоже, должен быть лучший путь, и это наверняка появилось в списке вариантов использования MS, я просто не вижу ответа.

Ответы [ 2 ]

4 голосов
/ 21 мая 2011

Подход, который вы можете использовать, будет сильно различаться в зависимости от конкретного сценария. Несколько вариантов включают:

  • Выполнение, как вы говорите, и добавление условного выражения в представление
  • Абстрагирование условного (если оно сложного) в вашу модель представления, так что линии в представлении все еще просты (просто получая доступ к предустановленному логическому значению в вашей модели представления).
  • Выполнение этого условия на уровне маршрута или контроллера и вызов другого общего вида (который может иметь общий вид (бритва) или общий вид (веб-формы mvc))

Вы не упоминаете явно, как бы вы отображали элементы управления в условном выражении. Я предполагаю, что вы будете делать RenderPartial. Таким образом, сами линии в представлении будут довольно «маленькими».

if(myViewModel.ComplexBoolean) // Boolean set in generation of view model
    Html.RenderPartial('firstPartial')
else
    Html.RenderPartial('secondPartial')

РЕДАКТИРОВАТЬ : Если элемент, который вы устанавливаете как «видимый», является просто одним элементом управления, вы можете просто вывести элемент управления напрямую, например,

if(myViewModel.ComplexBoolean) {
    Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}

Кроме того, если вы не хотите устанавливать это свойство Model.Types (например, чтобы сохранить попадание в БД), тогда условным условием может быть местоположение, в котором вы создаете модель представления (либо контроллер, либо какой-либо сервис / представление). модель репо). Вместо этого представление может просто проверить наличие свойств:

if(Model.Types != null) {
    Html.DropDownListFor(m => m.Type, Model.Types /* An IEnumerable<SelectListItem>*/, new { @class = "myList" });
}
3 голосов
/ 21 мая 2011

Если ваши элементы управления не используют данные, найденные в ViewModel вашего View, вы также можете использовать Html.RenderAction для вызова дочерних действий. Например, предположим, что вы хотите отобразить другое меню для пользователей с разными ролями. Вы можете вызвать @ {Html.RenderAction ("Меню", "Учетная запись");} в вашем представлении, что вызовет действие "Меню" в вашем контроллере "Учетной записи". Ваша сложная логическая логика и логика для формулировки настроек ваших контроллеров будут находиться в действии «Меню» контроллера «Аккаунт». Действие «Меню» решит, какой частичный вид / контроллер отображать.

// This goes in your View (clean single line!)

@{Html.RenderAction("Menu", "Account");}


// This goes in your controller

[ChildActionOnly]
public ActionResult Menu()
{
    bool isAdmin = false;

    // Your complex boolean logic goes here

    // Set your controller settings here

    string controllerSettings = ""; // Use class or array for multiple settings

    if (isAdmin)
    {
        return PartialView("~/Views/Account/_AdminMenu.cshtml", controllerSettings);
    }
    else
    {
        return PartialView("~/Views/Account/_StandardMenu.cshtml", controllerSettings);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...