.NET MVC3 + Razor Multiple RenderView / RenderAction - PullRequest
0 голосов
/ 14 июля 2011

Мой партнер и я решили создать приложение в .NET MVC3 с использованием Razor, поскольку никто из нас не использовал ни .NET MVC, ни Razor.У меня есть страница с «панелью пользователя», к которой я добавил несколько разделов RenderView / RenderAction, обычно с формами.Все эти формы преобразуются в JQuery JSON-формы при загрузке:

 $('#main').delegate("form:has(.siteFormField)", "submit", function () {/*form and submit logic here*/})

и получают обратно частичные представления, которые обычно представляют собой обновленные версии форм вместе с сообщением о состоянии.

У меня есть одиннабор форм, в которых ввод одного элемента влияет на содержимое другого (нажмите кнопку «зарегистрироваться», и элемент будет перемещен в другой список).Я отображаю обе формы в одном частичном представлении, которое включено в панель мониторинга, используя RenderAction для вызова контроллера, который возвращает представление с обновленными обеими формами.Однако форма с кнопками вызывает другой контроллер, который обычно возвращает только обновленную форму и сообщение о состоянии.Обычно я делал бы все это в JavaScript, вызывая методы и анализируя результат, чтобы определить, как преобразовать DOM, но мы пытаемся сделать это как MVC + Razor, насколько это возможно.Есть ли чистый способ отправить модель в контроллер и получить результат, возвращающий другое представление в зависимости от контекста передачи, или я слишком обдумываю эту проблему?

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Да, есть несколько способов сделать это.Два простых:

  1. Пусть ваш начальный метод перенаправляет на соответствующий метод контроллера на основе содержимого запроса.Если все ваши параметры передаются через GET, это быстрый и простой способ.Недостатком является то, что данные POST не перенаправляются, поэтому при вызове метода [HttpPost] он не будет работать.

  2. Метод View в базовом классе контроллера MVCзанимает много перегрузок.Один из них берет имя представления, позволяя вам сделать что-то вроде этого:

    switch ( foo ) 
    {
        case 1:
            return this.View("View1", InputModel.Case1Data);
        case 2:
            return this.View("View2", InputModel.Case2Data);
        default:
            return this.View(InputModel.FallbackData);
    }
    

РЕДАКТИРОВАТЬ: Я думаю, что я, возможно, не полностью понял ваш вопрос, чтобы уточнить:

Вам потребуется придумать метод с одним контроллером, который может выступать в качестве метода «рассылки», и все ваши формы будут отправлены на это.Внутренний метод может возвращать различные данные на основе данных модели, которые вы передаете.

Для работы с моделью у вас также есть несколько вариантов:

  1. Создайте одну большую модель с объединением каждого поля в каждой отдельной модели и заполните все, что вам нужно.

  2. Создайте иерархическую модель с отдельными моделями в качестве дочерних свойств родительского контейнера.MVC очень хорошо превращает дочерние объекты (и массивы) в связанные поля и обратно.Поэтому ввод HTML с именем, подобным «Case1Data.Name», будет привязан к полю «Имя» поля Case1Data класса модели.

0 голосов
/ 14 июля 2011

Самый простой способ - создать одно действие / модель / представление для каждого из ваших сценариев.Вы можете одним действием вернуть другой вид / модель.Представление знает, где ему нужно опубликовать поддерживаемую модель.

Конечно, вы можете делать более сложные вещи, например, строить свою модель как объект javascript и отправлять JSON в действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...