Проблемы формы с видом на модель (AutoMapping) - PullRequest
0 голосов
/ 13 декабря 2010

Привет,

Я создаю приложение ASP.NET MVC и у меня возникли проблемы с обработкой данных.

Одно из моих действий выглядит так:

public ActionResult Register(int categoryId, int? filterId)

Это действие будет создавать экземпляр формы регистрации, и в этом случае это означает загрузку пользовательского объекта ViewModel с данными из БД ( Entity Framework ) и отправку его в строго типизированное представление.

Чтобы перевести объект модуля в объект просмотра, который я использую AutoMapper

Когда пользователь изменил данные и нажал "Отправить", будет запущено следующее действие:

[CustomAuthorize(Roles = SiteRoles.Admin)]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Register(ModelViewRegisterFilter filter)

Это действие запустит следующий код:

        if(filter.EditingFilter.Id > 0)
            adCategoryFilter = Mapper.Map<RegisterFilterItem, AdCategoryFilter>(filter.EditingFilter, filterModel.GetFilter(filter.EditingFilter.Id));
        else
            adCategoryFilter = Mapper.Map<RegisterFilterItem, AdCategoryFilter>(filter.EditingFilter);

AdCategoryFilter - это класс из Model (db).Когда это сделано, не должно быть никаких проблем с сохранением объекта модели сущности (adCategoryFilter).

Проблема 1 У меня есть поле в таблице БД, которое называется DisplayCheckBox и имеет тип nullable tinyint,Чтобы представить это, я создал недействительный bool в моем объекте просмотра.При использовании AutoMapper для перевода из Model в ModelView я получаю следующее исключение:

Попытка сопоставить System.Byte с System.Nullable`1 [[System.Boolean, mscorlib, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089]].Использование конфигурации сопоставления для Biss.Models.Model.AdCategoryFilter для Biss.Views.ViewClasses.RegisterFilterItem Свойство назначения: DisplayCheckBox Исключение типа 'AutoMapper.AutoMapperMappingException' было сгенерировано.

Я проверял сгенерированное свойствокласс модели и выглядит так:

Nullable<global::System.Byte>

Задача 2 Когда форма отправлена, объект viewmodel будет заполнен данными из формы.Если существует textBox со значением "" (string.empty), тогда строка будет иметь значение null.

Поле db, представляющее это текстовое поле, имеет тип nchar (100), и это генерируетсяструктурой сущности в строку.Проблема заключается в том, что automapper попытается установить нулевое значение для свойства DisplayTextBox объекта модели, и это вызовет исключение:

Это свойство не может быть установлено в нулевое значение.

Пожалуйста, совет.

1 Ответ

1 голос
/ 14 декабря 2010

1) Automapper не делает никаких неявных преобразований для вас.Вам нужно будет указать, как конвертировать это значение, используя одну из точек расширяемости autoppers .

.Этот тест вызовет исключение:

   [TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Mapper.CreateMap<HasByte, HasBool>();

        var hasByte = new HasByte() { Value = 1 };

        var hasBool = Mapper.Map<HasByte, HasBool>(hasByte);
    }
}

public class HasByte
{
    public Nullable<Byte> Value { get; set; }
}

public class HasBool
{
    public Nullable<bool> Value { get; set; }
}

2) Не устанавливайте свойство, которое не может быть нулевым, равным нулю.Используйте атрибут [Bind], чтобы игнорировать это свойство или проверить значение в форме для нулевого значения, прежде чем пытаться связать его с моделью.Вот хорошая статья об использовании атрибута Bind:

http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/

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