Я пытаюсь найти лучший способ использования MVC для моделей, которые только частично редактируются.Лучшая оценка для свойств модели MVC, которые не связаны?
Ниже приведен простой пример.
Модель
using System.ComponentModel.DataAnnotations;
public class SimpleModel
{
public int Id { get; set; }
public string Parent { get; set; }
[Required]
public string Name { get; set; }
}
Посмотреть
using System.ComponentModel.DataAnnotations;
public class SimpleModel
{
public int Id { get; set; }
public string Parent { get; set; }
[Required]
public string Name { get; set; }
}
Контроллер
using System.Web.Mvc;
public class SimpleController : Controller
{
public ActionResult Edit(int id)
{ return View(Get(id)); }
[HttpPost]
public ActionResult Edit(int id, SimpleModel model)
{
if (model.Name.StartsWith("Child")) //Some test that is not done client-side.
{
Save(model);
//Get the saved data freshly.
//model = Get(id);
}
else
{
ModelState.AddModelError("", "Name should start with 'Child'");
}
//Is this the way to set the Parent property?
//var savedModel = Get(id);
//model.Parent = savedModel.Parent;
return View(model);
}
//Mock a database.
SimpleModel savedModel;
private void Save(SimpleModel model)
{ savedModel = new SimpleModel() { Id = model.Id, Name = model.Name }; }
private SimpleModel Get(int id)
{
if (savedModel == null)
{ return new SimpleModel() { Id = id, Parent = "Father", Name = "Child " + id.ToString() }; }
else
{ return new SimpleModel() { Id = savedModel.Id, Parent = "Father", Name = savedModel.Name }; }
}
}
Поле Имя является редактируемым. Поле «Родитель» предназначено только для справки и не должно обновляться. Поэтому он отображается с помощью DisplayFor.
После публикации, я получаю модель с свойством Родительский набор в null. Это не проблема, поскольку она не будет сохранена. Однако, когда я просто возвращаю полученную модель в представление, поле родителя больше не будет отображаться. Когда модель верна, я могу легко получить ее снова из базы данных и, таким образом, вернуть значение поля родителя.
Если модель недействительна, я бы хотел, чтобы пользователь исправил ввод и попытался сэкономить еще раз. Там, я должен использовать значения принимаемой модели, которые являются входными, но отображаемые значения также должны отображаться.
В действительности есть много полей, которые будут показаны для справки, чаще всего из разных объектов базы данных, чем тот, который редактируется.
Я видел предложения передать поля как скрытые поля в представлении, но я очень неохотно читаю данные от клиента, которые не должны обновляться.
Есть ли более элегантный способ сделать это, чем копировать эти значения в модель вручную или передавать их как скрытые поля?
Это не касается его проблемы вообще. Он не хочет получать информацию каждый раз из базы данных. –
На самом деле, я действительно не против вытащить его из базы данных. Я ищу только способ избежать копирования свойств и т. Д. На самом деле, я просто не вижу вид представления Webforms :-( –
Этот ответ выглядит удобным способом отделить редактируемые значения от ссылочных значений. Добавление модели для ссылочных значений в качестве свойства модель редактирования - это хороший способ разрешить строго типизированные представления, без необходимости извлекать данные из состояния представления. Спасибо. –