ASP> чистые вторичные частичные элементы MVC

Работая с .net как в winforms, так и в ASP.net в течение нескольких лет, я начинаю входить в MVC (немного поздно знаю). Одна из основных путаниц для меня - концепция многоразовых "компонентов", аналогичная концепции пользовательского контроля в веб-формах.

Например, я хотел бы иметь несколько "виджетов" в области членов моего сайта, одним из которых является подробная информация о зарегистрированном диспетчере учетных записей пользователей. Я могу создать это как частичное, однако, когда страница загружает данные, которые необходимо передать в рамках ViewModel/View Data. Я хотел бы использовать этот виджет в нескольких разных разделах, которые тогда означали бы, что мне нужно передать код для передачи данных в несколько разных контроллеров. Это, кажется, нарушает принцип СУХОЙ, или я что-то пропустил здесь? В идеале мне бы хотелось, чтобы все было инкапсулировано в пределах 1 части, которое затем можно использовать на любой странице.

1 ответ

Вы можете выполнить три способа:

1) Для простых элементов управления без большой логики вы можете создать новый экземпляр пользовательской модели представления для элемента управления: Html.RenderPartial( "YourControl", новый YourControlViewModel() {Param1 = "value1", Param2 = Model.AnotherValue});

2) Если вам нужна логика заднего конца для управления, вы можете использовать Html.RenderAction( "ActionName", "SomeControllerName", RouteValuesDictionary); Он будет вызывать стандартное действие контроллера, использовать представление и вставить полученный результат обратно на страницу. Вы можете добавить атрибут [ChildActionOnly] к методу контроллера, чтобы гарантировать, что метод будет доступен только из Html.RenderPartial. Он несколько нарушает принцип MVC (view не должен вызывать контроллер), но он отлично подходит для виджетов и используется в мире Ruby on Rails без особых проблем. Вы можете проверить отличную статью из Haacked

3) Создайте собственный html-помощник для задач, таких как форматирование даты, вычисление и т.д.

В вашем случае я бы выбрал номер два.

licensed under cc by-sa 3.0 with attribution.