2013-03-29 3 views
2

Я пытаюсь найти лучший способ использования 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. Это не проблема, поскольку она не будет сохранена. Однако, когда я просто возвращаю полученную модель в представление, поле родителя больше не будет отображаться. Когда модель верна, я могу легко получить ее снова из базы данных и, таким образом, вернуть значение поля родителя.

Если модель недействительна, я бы хотел, чтобы пользователь исправил ввод и попытался сэкономить еще раз. Там, я должен использовать значения принимаемой модели, которые являются входными, но отображаемые значения также должны отображаться.

В действительности есть много полей, которые будут показаны для справки, чаще всего из разных объектов базы данных, чем тот, который редактируется.

Я видел предложения передать поля как скрытые поля в представлении, но я очень неохотно читаю данные от клиента, которые не должны обновляться.

Есть ли более элегантный способ сделать это, чем копировать эти значения в модель вручную или передавать их как скрытые поля?

ответ

1

Что можно сказать о тех свойствах, которые нельзя редактировать, в другую модель и позволить им позаботиться об этих свойствах?

вид Модель

public class PersonViewModel 
{ 
    public int Id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 

    public PersonDetailsModel DetailsModel { get; set; } 
} 

Детали Модель

public class PersonDetailsModel 
{ 
    public string Mother { get; set; } 
    public string Father { get; set; } 

    public PersonDetailsModel() { } 

    public PersonDetailsModel(int personId) 
    { 
     // pull required model data from databases 
     var db = DBParentContext; 
     Mother = db.Parent.Where(m => m.ChildId == personId) 
     Father = db.Parent.Where(m => m.ChildId == personId) 
    } 
} 

Контроллер

public class PersonController : Controller 
{ 
    [HttpPost] 
    public ActionResult Edit(PersonViewModel viewModel) 
    { 
     viewModel.DetailsModel = new PersonDetailsModel(viewModel.Id) 

     if (ModelState.IsValid) { 
      // ~ 
     } 
     return View(viewModel) 
    } 
} 

Посмотреть

@model PersonViewModel 

@Html.DisplayFor(m => m.DetailsModel.Mother) 
@Html.DisplayFor(m => m.DetailsModel.Father) 
@Html.TextBoxFor(m => m.FirstName) 
@Html.TextBoxFor(m => m.LastName) 

Поскольку детали, как ваша мать не-редактируемые, то они не являются действительно частью модели «Edit», так что я бы боксировать так далеко и попытаться дать что-то еще заботиться о их.

+0

Это не касается его проблемы вообще. Он не хочет получать информацию каждый раз из базы данных. –

+0

На самом деле, я действительно не против вытащить его из базы данных. Я ищу только способ избежать копирования свойств и т. Д. На самом деле, я просто не вижу вид представления Webforms :-( –

+0

Этот ответ выглядит удобным способом отделить редактируемые значения от ссылочных значений. Добавление модели для ссылочных значений в качестве свойства модель редактирования - это хороший способ разрешить строго типизированные представления, без необходимости извлекать данные из состояния представления. Спасибо. –

1

Если вы не собираетесь обновлять поле родителя, то это действительно не имеет значения, если оно скрыто или нет, так как вы не будете обновлять его на столбе.

Я бы использовал скрытый в этом случае, просто не забудьте обновить это поле.

Смежные вопросы