2015-02-23 2 views
3

Я разрабатываю многоступенчатую форму с sitecore и mvc. На каждом шаге мне нужен контекст sitecore, и для этого я использую рендеринг контроллера. Теперь, когда sitecore работает, мне нужно добавить имя контроллера и действие для моего рендеринга, поэтому в основном я могу использовать только одно действие контроллера для каждого рендеринга.Sitecore MVC multi step form

В моем случае я использовал одно и то же имя действия, но различные типы параметров для каждого шага в многоэтапной форме. В идеале я хотел бы иметь другое имя действия контроллера для каждого шага в многоступенчатой ​​форме. Может ли кто-нибудь помочь мне в этом?

Thanks

+0

Привет, я не знаю, что Site Core больше, чем CMS, но если бы у меня была аналогичная проблема в другой CMS, я бы написал несколько правил маршрутизации MVC. Теперь вы можете сказать, что этот {префикс}/{controller}/{action} переходит к этому конкретному контроллеру/действию. Может ли это быть решением? – Andreas

+0

Привет Андреас. Спасибо за ваш ответ, но это многие не работают. Как я уже упоминал в своем посте, мне также нужен контекст Sitecore, доступный в моих действиях. –

ответ

1

Я не уверен, что полностью понял вопрос. Вы пытаетесь использовать один файл .cshtml для всех шагов? Если это так, вы можете определить несколько визуализаций контроллера для одного и того же представления в Sitecore CMS. В разделе рендеринга определите каждый шаг вашей многоступенчатой ​​формы как отдельные визуализации контроллера. Вы можете использовать один и тот же контроллер для каждого, но указать другое действие.

В вашей логике контроллера вы можете указать, чтобы возвращать тот же вид, но передавать различные свойства в объект модели.

Например, вы могли бы сделать что-то вроде этого:

public ActionResult Step2(){ 
    var context = RenderingContext.Current.PageContext.Item; 
    var otherParams = "SomethingForStep2"; 
    var model = new MyModelObject(context, otherParams); 
    var view = this.View("Path/To/My/View", model); 

    return view; 
} 

В приведенном выше примере, я предполагаю, что вы определили какой-то объект модели, где вы можете пройти в любой параметры вам нужно, чтобы ваш взгляд может используйте это для рендеринга.

Если вы используете разные виды, вы просто вернете другое представление для каждого действия, снова передав модель в представление, чтобы помочь ему визуализировать.

+0

Jay. Вы очень близки. У меня есть один и тот же рендеринг контроллера и различная перегрузка действия, которое возвращает разные частичные представления. Поскольку в рендеринге контроллера мне нужно указать имя действия, контекст Sitecore доступен только в этом действии, а то, что я хочу, - это отдельное действие для каждого шага в том же рендеринге контроллера. –

+0

Если вы должны использовать один и тот же рендеринг контроллера (я предполагаю из-за деталей презентации), тогда у вас будет только одно действие, которое может быть запущено. Как сказано, в действии вашего контроллера вы можете легко делегировать другим методам и разбить свой метод действий на несколько методов на основе параметров или информации, которые вы извлекаете из контекста. Если вам нужно несколько действий с разными видами, вам, вероятно, понадобятся несколько визуализаций контроллера. Добавьте все их на страницу и установите соответствующие контролеры «пустые» представления, если они в настоящее время не нужны. –

0

Если вы используете AJAX (я предполагаю), я бы рекомендовал следующее:

  1. Подавать каждый вид/шаг вашей многоэтапной формы с использованием HttpGet уникального действием в контроллере
  2. Представляет каждый вид/шаг формы с уникальным элементом и уникальным представлением (присваивать представления элементам и использовать пустой макет, чтобы позволить визуализировать форму/представление самостоятельно)
  3. Обрабатывать действия каждой формы с помощью уникальное действие HttpPost в вашем контроллере
  4. Из HttpPos t, верните объект JSON, который можно обработать на стороне клиента. Включите в эти свойства результата, такие как успех, ошибки, ошибки проверки и следующий шаг формы для отображения (URL-адрес для следующего запроса AJAX - вызов этого свойства NextStepUrl)
  5. В вашей клиентской части JavaScript есть функция для обработки объект результата JSON, возвращаемый действием POST вашего контроллера. В случае успеха читать NextStepUrl свойство затем использовать для выполнения GET запрос AJAX для следующего шага формы

Этот подход означает, что на каждом GET запросить у вас будет действующий RenderingContext из которого следует читать источник данных вашего контроллера Rendering в ,

Если вам нужно иметь RenderingContext во время действий HttpPost, вы можете просто включить скрытое поле с идентификатором элемента данных и прочитать это в действии HttpPost, или вы можете использовать некоторый custom model binding для достижения того же самого в немного более чистый способ.