ASP.NET MVC Модель путаницы - PullRequest
2 голосов
/ 21 декабря 2009

Фон

Я изучаю, как правильно использовать ASP.NET MVC, и столкнулась с этой проблемой с моделями:

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

Задача

У меня есть бизнес-правило, согласно которому некоторые поля нельзя редактировать после создания, а другие поля доступны только после редактирования.

Я получаю грязный объект от пользователя (один с полями, к которым он должен прикасаться), и, используя метод привязки MVC (указав объект в сигнатуре метода), пользователи вставляют не редактируемое поле contact_dob.

Вопрос

  1. Должен ли я вместо этого снова получить запись, перезаписать только поля, которые я хочу обновить, и затем отправить ее в базу данных?

  2. Какой самый лучший метод, когда я не хочу снова извлекать весь объект целиком из базы данных, я просто переделываю другую EntityModel, которая является более легкой версией основной модели, и использую ее взад и вперед?

  3. Я поступаю неправильно? Каковы оптимальные методы ограничения того, что пользователи могут редактировать?

Ответы [ 4 ]

1 голос
/ 21 декабря 2009

Похоже, что лучшим решением было бы использовать пользовательскую ViewModel. Это объект, который содержит все поля, которые пользователь хотел бы передать контроллеру.

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

public ActionResult Edit(ContactViewModel viewModel)
{
    var contact = repository.GetContacts().WithId(viewModel.Id);

    // Update the contact with the fields from the viewModel

    repository.Save(contact);
}
1 голос
/ 21 декабря 2009

Я думаю, что вы можете построить свою модель, класс Contact, и в представлении редактирования вы должны разрешить только поля, которые можно редактировать, и скрыть или установить как недоступные для редактирования поля, которые вы не хотите редактировать, затем В вашем контроллере вы получите исходный контакт и обновите его значениями полей, которые вы разрешили в режиме редактирования, например:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {
    Contact contact = repository.GetById(id);
    try {
        UpdateModel(contact);
        repository.Save(contact);
        return RedirectToAction("Details", new { id=contact.Id });
    }
    catch(Exception ex) {
        // Do something...
    }

    return View(contact);
}
0 голосов
/ 21 декабря 2009

«Лучшая практика» - провести проверку в отношении представленной модели и не допускать внесения изменений в определенные поля. Вы можете использовать JQuery / JavaScript для выделенных серым цветом текстовых полей, которые нельзя изменить ; а также проверка на стороне модели, чтобы запретить изменения определенных полей (сравнивая их с данными из базы данных).

Вы можете использовать Проверка модели , чтобы запретить изменения определенных полей. ASP.NET MVC 2 имеет эту функциональность. Вам даже не нужно повторно извлекать объект.

В пошаговом руководстве NerdDinner (ASP.NET MVC 1.0) приведено пошаговое руководство по валидации .

0 голосов
/ 21 декабря 2009

Вы должны использовать ограничения EXCLUDE и INCLUDE в Метод действия . Таким образом, ваша модель исключит ненужные поля во время привязки модели.

public ActionResult Create ([Bind (Exclude = "contact_dob")] Контактный контакт)

    {
        _db.AddToContacts(contact);
        _db.SaveChanges(); 
        return RedirectToAction("Index");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...