У меня есть приложение сфальсифицированы следующим образом ...MVC 5 EF 6 TPT и ViewModels
модели и подмодели
public class BaseModel
{
public int Id { get; set; }
// Other required properties
}
public class SubModel : BaseModel
{
public string SomeString { get; set; }
// Other SubModel properties
}
В контексте
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<SubModel>().ToTable("SubModel");
}
Model Binder, которая принимает строку определенный в моем представлении Create и возвращает соответствующий SubModel.
public class BaseModelBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
if (modelType.Equals(typeof(BaseModelBinder)))
{
string typeValue = bindingContext.ValueProvider.GetValue("ModelType").AttemptedValue;
Type type = Type.GetType(modelType.Namespace + "." + typeValue, true);
object model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
return model;
}
return base.CreateModel(controllerContext, bindingContext, modelType);
}
}
Контроллер
[Route("Create"), HttpGet]
public ActionResult Create(string modelType)
{
// Get Model Type from modelType and convert into appropriate type
// to retrieve the proper editor template.
Type type = Type.GetType("MyApp.Models." + modelType);
object model = Activator.CreateInstance(type);
return View(model);
}
[Route("Create"), HttpPost]
public ActionResult Create(BaseModel baseModel)
{
if (ModelState.IsValid)
{
var userId = Convert.ToInt32(IdentityExtensions.GetUserId(User.Identity));
baseModel.UserId = userId;
baseModel.DatePosted = DateTime.UtcNow;
// If this is a SubModel, an insert is made into table BaseModel as well
// as an insert into the SubModel table for SubModel specific properties
// linked by the Id of the BaseModel as the SubModel Id
db.BaseModel.Add(baseModel);
db.SaveChanges();
return RedirectToAction("List");
}
return View(baseModel);
}
Создать Посмотреть
@model MyApp.Models.BaseModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true)
@Html.Hidden("ModelType", Model.GetType())
@Html.EditorForModel()
</div>
}
редактор шаблонов для подмодели
@model MyApp.Models.SubModel
// Form Stuff
Это все работает нормально, и денди. Я могу вытащить Create View и отобразить правильный шаблон для запрошенной SubModel, и когда я его опубликую, действие Create HttpPost принимает его так же, как и тип BaseModel, и вставляет его как в таблицу SubModel, так и в таблицу BaseModel. Теперь то, что я хотел бы сделать, это создать ViewModels для моей BaseModel и SubModels, чтобы чистые модели домена.
ВЫПУСКА
Если я изменить мой контроллер для возврата ViewModel, когда я отправляю к Create действий, это не правильный тип, так как он не наследует от BaseModel.
Как создать ViewModel для BaseModel, который предоставляет только определенные свойства, которые я могу аннотировать Data для проверки на стороне клиента, а также создавать SubViewModels для SubModels и иметь SibViewModel также типа SubModel, который также будет иметь тип BaseModel, поскольку SubModels наследуются от BaseModel?
Я также хочу, чтобы SubViewModels наследовали свойства BaseModelViewModel, поскольку каждой SubModel потребуются части BaseModel.
Глядя на это link, ответ, который говорит о дженериках, возможно, путь, который я ищу, но не знаю, как его правильно реализовать.
Мне нужно взять ViewModel, передать его контроллеру Create [HttpPost] и вставить его в таблицу BaseModel (или SubModel и BaseModel в зависимости от ViewModel).
Долгий пост и может быть путаным, как я это сформулировал, так как мне трудно описать вещи, которые я иногда пытаюсь выполнить. Я тратил часы на часовые чтения на ASP.NET MVC, и, похоже, чем больше я читаю, тем больше я сомневаюсь в своих шаблонах дизайна, потому что существует так много альтернатив для выполнения той же задачи, что у каждого есть плюсы и минусы, зависящие от этого многие факторы ... Мой ум перегружен. Пожалуйста, помогите:]
Я вижу, куда вы идете сюда, я собираюсь исследовать это больше. Спасибо за помощь. –