ASP.NET Модель MVC, разделенная на несколько частичных представлений
-
27-10-2019 - |
Вопрос
Я разрабатываю веб-приложение Razor на MVC 3, в котором хранятся сведения о нескольких категориях объектов.(Транспортные средства, Дома, Инструменты и т.д.).Все объекты имеют некоторые общие данные (название, описание и т.д.) И некоторые детали, характерные для категории, к которой они принадлежат.Ожидается , что список категорий будет расти , и ввиду снижения удобства сопровождения мы надеемся повторно использовать тот же мастер добавления объекта .Мастер основан на следующей реализации.
http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx
В многоступенчатом процессе работы мастера последний шаг позволяет пользователю ввести данные, относящиеся к конкретной категории (модель, марка, VIN и т.д. Для транспортного средства).В настоящее время я представлял себе этот заключительный шаг как частичное представление с помощью AJAX.Таким образом, на самом деле у нас будет несколько частичных представлений, которые отражают конкретную категорию, но совместно используют остальной код мастера.
Мой универсальный объект модели выглядит следующим образом
public class AssetView
{
[Required]
public string Title
{
get;
set;
}
[Required]
public string Description
{
get;
set;
}
// Few more generic fields here
public SpecificAsset AssetDetails { get; set; }
}
Комплексное свойство AssetDetails представлено каждым типом частичного представления.Таким образом, PartialView "MotorDetails" будет содержать строго типизированную модель типа MotorAsset, которая объявлена как показано ниже.
public class MotorAsset : SpecificAsset
{
[Required]
public string Transmission
{
get;
set;
}
[Required]
public string Make
{
get;
set;
}
}
Фактическая проверка намного сложнее, но я опустил их, чтобы было легче понять.
Главная страница Мастера объявляется как
@model AssetView
.....
<div class="wizard-step">
....
</div>
<div class="wizard-step">
....
</div>
<div class="wizard-step">
@{Html.RenderPartial("_MotorCreate", Model.AssetDetails);
</div>
Частичный вид двигателя как
@model MotorAsset
Мой вопрос заключается в том, как я могу выполнить проверку модели в этом сценарии (или это возможно использовать), поскольку последний шаг находится не на странице просмотра, а в частичном представлении.
Решение
Почему бы вам не прибегнуть к простому наследованию классов (парадигма ООП) вместо того, чтобы иметь свойство AssetDetails в вашем AssetView?
Вместо того, что у вас сейчас есть, вам следует скорее объявить
AssetView (общие свойства) -> MotorView, наследующий AssetView (специфические свойства)
Вот так:
public class AssetView {
[Required]
public string Title { get; set; }
[Required]
public string Description { get; set; }
// Few more generic fields here
}
public class MotorView : AssetView {
...
}
@model MotorView // you still have access to the AssetView's properties in your view and in your controller actions
Если вы хотите оставить все так, как у вас есть сейчас, то используйте EditorFor()
и создать EditorFor
шаблон в общей папке и строго введите его в MotorAsset
(или SpecificAsset
, если вы хотите, чтобы это было еще более обобщенно).
Затем визуализируйте это следующим образом:
@Html.EditorFor(model=>model.AssetDetails)
Это позволит контроллеру проверить его и автоматически привязать к свойству в вашем AssetView
.HTH