Многофункциональная модель MVC3 .net или модель с одним представлением - PullRequest
0 голосов
/ 16 февраля 2012

Я хочу создать веб-страницу, которая имеет 3 вкладки (и, следовательно, 3 деления): Вкладка 1 - Вкладка «Обновление личных данных» 2 - Вкладка «Проверить порядок» 3 - Изменить данные для входа в систему

Существует 2 способа реализации этого.насколько я могу судить, но хотел бы знать передовой опыт.

Во-первых, было бы 3 Частичных Представления, которые реализуют отдельную Модель, а в каждую секунду было бы 3 Частичных Представления, которые реализуют одну ViewModel * 1005.*

Первый вариант, если использование частичных представлений вызовет ошибку «Ожидайте модель A, но получил модель B». Я полагаю, что вы можете использовать RenderAction, чтобы обойти это, но это лучший метод?

Мнения приветствуются.

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Глядя на названия вкладок, «Обновить личные данные», «Проверить порядок» и «Изменить данные для входа» - кажется, что это довольно разные, но связанные параметры, которые может сделать пользователь.

Для меня имеет смысл разделить их на три разных действия с тремя разными представлениями, что означает, что вы рендерите действие только для видимой вкладки. Таким образом, если пользователь хочет, скажем, только обновить свои данные, сервер не выполняет запросы к БД для проверки порядка

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

, например

<div id="content">
    <ul>
       <li class="active">Update Personal Details</li>
       <li>@Html.ActionLink("Check Order","CheckOrder")</li>
       <li>@Html.ActionLink("Update Logon Details","UpdateLogonDetails")</li>
    </ul>
    <div id="tab1" />
     ... Update Personal Details Tab... etc
    </div>
    ... tab2 and tab 3 not included...
</div>

Действия для CheckOrder и UpdateLogonDetails будут отображать одно и то же представление, но будет отображаться другая вкладка.

Это создаст иллюзию того, что все это выполняется с использованием вкладок, даже если это не так.

Затем, когда у вас все это работает, вы можете обновить эти ссылки, используя JQuery, чтобы запускать запросы через AJAX, возвращая результаты в виде частичных представлений и обновляя div содержимого с результатом. Это означает, что люди с включенным Javascript получают надлежащий опыт «ajax», но все равно работает нормально для тех, у кого отключен javascript.

0 голосов
/ 16 февраля 2012

user1079925,

Как вы говорите, существует множество способов сделать это, и все будет зависеть от того, насколько «связаны» данные. если все это происходит от одного и того же контроллера, то имеет смысл иметь одну модель представления для инкапсуляции данных. Вот краткая статья о том, как это может выглядеть:

public class SubViewModelA
{
    public string SpecialProperty { get; set; }
}

public class SubViewModelB
{
    public string SpecialProperty { get; set; }
}

public class SubViewModelC
{
    public string SpecialProperty { get; set; }
}

public class TabbedViewModel
{
    public SubViewModelA TabA {get; set; }
    public SubViewModelB TabB {get; set; }
    public SubViewModelC TabC {get; set; }
}

по вашему мнению, это будет упоминаться как:

@model TabbedViewModel

<div id="taba">@Html.EditorFor(model => model.TabA.SpecialProperty )</div>
<div id="tabb">@Html.EditorFor(model => model.TabB.SpecialProperty )</div>
<div id="tabc">@Html.EditorFor(model => model.TabC.SpecialProperty )</div>

Теперь, это не красиво (я оставлю эту часть для вас), но позволит вам заполнить ваши «вкладки» из одной модели представления. другая альтернатива, как вы упомянули, это иметь 3 @RenderAction() блоков внутри тегов div, если данные полностью не связаны между собой.

...