У меня возникли проблемы с пониманием правильного способа создания моделей представления и сохранения этой информации в базе данных с помощью Entity Framework, и я не могу найти информацию, которую я ищу потому что, пожалуйста, простите меня, если я упустил это.Просмотреть виртуальные свойства модели и выпадающие списки
Я наткнулся на это сообщение here, и он, кажется, задает тот же вопрос, но не получает ответа.
Мои основные вопросы,
Для целей редактирования, если у меня есть ProductModel model
, который имеет Warranty model
отношения, я должен использовать virtual property Warranty
в модели представления или я должен использовать int WarrantyId
?
Если я должен использовать виртуальную собственность, почему не этот код сохранить Warranty
правильно?
Нужно ли явно указывать или заполнять гарантию на обновление?
Пожалуйста, не заполняйте мое редактируемое представление и не выбирайте списки по назначению.
My (упрощенный) код установки следующим образом:
Модель:
public int ModelId{ get; set; }
public int ModelNumber { get; set; }
public virtual Warranty Warranty { get; set;}
вид Модель:
public int ModelId { get; set; }
[Required(ErrorMessage = "Model Number required")]
[StringLength(25, ErrorMessage = "Must be under 25 characters")]
[Display(Name="Model Number")]
public string ModelNumber { get; set; }
//related objects and necesary properties
public virtual Warranty Warranty { get; set; }
public IEnumerable<SelectListItem> WarrantySelectListItems { get; set; }
Controller (ГЭТ):
public ActionResult Edit(int? id)
{
//check the id
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
//get the model and make sure the object is populated
var model = _modelService.GetModel(id.Value);
if (model == null)
{
return HttpNotFound();
}
//pass our entity (db) model to our view model
var editModelModel = new EditModelModel();
editModelModel.InjectFrom(model);
//warranty select list
editModelModel.WarrantySelectListItems = WarrantySelectList(editModelModel.Warranty.WarrantyId);
//option multi select list
editModelModel.OptionSelectListItems = OptionSelectList();
return View(editModelModel);
}
контроллер (POST) (незавершенное производство):
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(EditModelModel editModelModel)
{
if (!ModelState.IsValid)
{
return View(editModelModel);
}
var modelEntity = new Model();
modelEntity.InjectFrom(editModelModel);
_modelService.Update(modelEntity);
_unitOfWork.Save();
return RedirectToAction("Index");
}
View (упрощенно):
<div class="form-group">
@Html.Label("Warranty", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(x => x.Warranty.WarrantyId, Model.WarrantySelectListItems, "--Select--")
@Html.ValidationMessageFor(model => model.Warranty.WarrantyId)
</div>
</div>
Опять же, я просто хочу знать, как правильно/лучший способ настроить эти ViewModels и модель, так что EF делает так много работы, как это возможно , Мне кажется, что если мне нужно создать поле WarrantyId
, я делаю что-то неправильно, но, возможно, это не так.
Заранее спасибо. Любое понимание/помощь приветствуется.
Хотя несколько других ответов были очень хорошими, я принимаю это как ответ на этот вопрос, потому что он отвечает на заданные вопросы и дает примеры того, как решить мой вопрос модели-viewmodel в пределах заданных границ исходного вопроса. Кроме того, он имеет самые высокие голоса. –