Используя Razor для создания формы для иерархии доменных моделей
-
21-12-2019 - |
Вопрос
Позвольте сказать, что у меня есть следующие классы (не могли бы вы также рассмотреть, если мои занятия с точки зрения этой части соотношения верны):
public class EFDbContext : DbContext
{
public DbSet<Project> Projects { get; set; }
public DbSet<Address> Addresses { get; set; } // *
public DbSet<Country> Countries { get; set; } // *
// Custom model builder bindings for * coz of the plural issue with EF
}
public class Project
{
public int ProjectID { get; set; }
public string Name { get ; set; }
public int AddressID { get; set; } // Database relation column
public Address Address { get ; set; }
}
public class Address
{
public int AddressID { get; set; }
public string Address1 { get ; set; }
public string Address2 { get ; set; }
public int CountryID { get; set; } // Database relation column
public Country Country { get ; set; }
}
public class Country
{
public int CountryID { get; set; }
public string Name { get; set; }
}
.
Как бы я пошел в бритву для этого ...
Мой «созданный проект» нужна форма, которая выглядит что-то подобное ... но это не правильно правильно?
@model Project
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address)
</div>
</div>
.
Так что я закончил создать генеракодицетагкод, который затем построил форму адреса:
@model Address
<div class="form-group">
@Html.LabelFor(model => model.Address1, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address1)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address2, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address2)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Country, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Country)
</div>
</div>
.
И, наконец, страна один ... который нуждается в Typeabead (поэтому некоторые пользовательские классы, добавленные к Shared/EditorTemplates/Address.cshtml
, который вы не можете сделать, я сделал editorfor
) - textbox
@model Country
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBox("", Model.Name.ToString(), new { @class = "countries typeahead" })
</div>
</div>
.
Это выглядит правильно?Я нахожу это очень подавляющим и запутанным (кстати, я попробовал это, и это не работает ... Но если я знаю, что это правильно, то я могу толкнуть в этом направлении)!
Решение
Вы на правильном пути.Просто будьте осторожны с тем, где вы помещаете свои редактирования в структуре проекта и как вы относитесь к ним.Конвенция МВЦ не всегда работает так, как вы будете надеяться, например,Использование шаблонов редактора для одной модели, когда модель завернута в список.
Одно предложение Мне было бы использовать полностью отдельную «модель просмотра» для модели, передаваемой на ваши виды бритвы.Вы можете сопоставиться между моделью «Вид» и «Модель вашей организации» (модель данных AKA), используя что-то вроде Automapper.Почему?Вы найдете со временем, что им потребуют разные вещи, например,Атрибуты MVC о свойствах модели.