Форма редактирования объекта со ссылкой на другой объект в раскрывающемся списке - PullRequest
0 голосов
/ 05 октября 2010

Моя проблема заключается в обновлении объекта через форму редактирования со ссылкой на другой объект, представленный в раскрывающемся списке. Я использую ASP.NET MVC 2. Детали:

Public Class Category
{
   int Id { get; set;}
   string Name { get; set}
   Category Parent { get; set}
}
  • Страница редактирования для категории, созданной с помощью EditorFor
  • Страница редактирования содержит раскрывающийся список для выбора родительской категории с именем / идентификатором = Parent.Id
  • В раскрывающемся списке есть запись none для value='' (для категорий без родителя).

Процесс обновления в действии:

  • Текущий объект, извлеченный из хранилища по идентификатору.
  • TryUpdateModel, примененный к извлеченной сущности

Проблема:

Когда передается отредактированная категория, если в раскрывающемся списке задано значение «none», создается новый объект для «parent», когда он пытается обновить parent.id. Это вызывает проблемы при сохранении через ORM. Итак, что делать в этой ситуации? Есть ли способ остановить создание экземпляра «родительского» объекта и оставить родительскую ссылку пустой?

Спасибо.

Обновление: Я использую NHibernate в качестве своего ORM, на случай, если это будет полезно.

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Похоже, хороший сценарий для пользовательского подшивки модели:

public class CategoryModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = base.BindModel(controllerContext, bindingContext) as Category;
        if (model != null && model.Id == null) // adapt this test if necessary
        {
            return null;
        }
        return model;
    }
}

А в Application_Start:

ModelBinders.Binders.Add(typeof(Category), new CategoryModelBinder()); 

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

0 голосов
/ 05 октября 2010

Вы можете добавить параметр parentId к методу действия и проверить его вручную, а если он равен null, вызвать метод TryUpdateModel с excludeProperties, установленным в

new [] {"Parent"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...