Многофункциональная модель MVC3 .net или модель с одним представлением
Я хочу создать веб-страницу, которая имеет 3 вкладки (и, следовательно, 3 деления): Вкладка 1 - Вкладка "Обновление личных данных" 2 - Вкладка "Проверить порядок" 3 - Изменить данные для входа
Насколько я могу судить, есть 2 способа реализовать это, но хотелось бы узнать лучшие практики.
Во-первых, было бы 3 Частичных Представления, которые реализуют отдельную Модель каждую секунду, было бы иметь 3 Частичных Представления, которые реализуют одну ViewModel.
Первый вариант, если использование частичных представлений вызовет ошибку "Ожидайте модель А, но получил модель Б". Я полагаю, что вы можете использовать RenderAction, чтобы обойти это, но это ли лучший метод?
Мнения приветствуются.
Спасибо
2 ответа
Если посмотреть на названия вкладок, "Обновить личные данные", "Проверить порядок" и "Изменить данные для входа" - кажется, что это довольно разные, но связанные параметры, которые может сделать пользователь.
Для меня было бы целесообразно разделить их на три разных действия с тремя разными представлениями, а это означает, что вы визуализируете действие только для видимой вкладки. Таким образом, если пользователь хочет, скажем, только обновить свои данные, сервер не выполняет запросы к БД для проверки порядка.
Вы могли бы использовать некоторые 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.
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, если данные полностью никак не связаны.