Html.DropDownList AutoMapper проблема - PullRequest
4 голосов
/ 25 августа 2010

Я получаю эту ошибку:

Элемент ViewData, имеющий ключ 'DepartmentId', имеет тип 'System.Int32', но должен иметь тип 'IEnumerable'.

со следующей настройкой. Я не уверен, как решить это. Ошибка происходит в коде модели. Эта строка: public void MapTo (Person domainModel). Я использую AutoMapper, чтобы отобразить ViewModel обратно в DomainModel (полностью изменив первоначальное отображение DomainModel в ViewModel).

Модель предметной области (с использованием LINQ to SQL, так что это частичный класс):

public partial class Person { }

// Validation rules
public class Person_Validation
{
    [HiddenInput(DisplayValue = false)]
    [ScaffoldColumn(false)]
    public object PersonId { get; set; }

    [HiddenInput(DisplayValue = false)]
    [ScaffoldColumn(false)]
    public object DepartmentId { get; set; }

    [DisplayName("Employee Name")]
    [Required(ErrorMessage = "Employee Name is required")]
    [StringLength(50, ErrorMessage = "Employee Name cannot be more than 50 characters")]
    public object Name { get; set; }

    [HiddenInput(DisplayValue = false)]        
    public object Active { get; set; }

    [HiddenInput(DisplayValue = false)]
    public object DateAdded { get; set; }

    [HiddenInput(DisplayValue = false)]
    public object DateDeleted { get; set; }

    public object Department { get; set; }     
}

Это моя модель:

public class PersonViewModel
{       
    public object PersonId { get; set; }

    public object DepartmentId { get; set; }

    public object Name { get; set; }

    public object Active { get; set; }

    public object DateAdded { get; set; }

    public object DateDeleted { get; set; }    

    public object DepartmentName { get; set; }

    //helper method
    public void MapTo(Person domainModel)
    {
        Mapper.Map(this, domainModel);
    }
}

Код класса контроллера:

[HttpPost]        
public ActionResult Edit(PersonViewModel viewModel)
{
    var domainModel = new Person();                                       
    try                    
    {                      
        viewModel.MapTo(domainModel);
        UpdateModel(domainModel);
        _personRepository.Save();
        return RedirectToAction("Index", "Person");
    }                      
    catch                  
    {                      
        return View(viewModel);
    }                      
} 

И мой просмотр HTML-код:

<div class="editor-field">                
<%: Html.DropDownList("DepartmentId", (IEnumerable<SelectListItem>)ViewData["DepartmentList"])%>                                     
<%: Html.ValidationMessageFor(model => model.DepartmentId) %>
</div>

1 Ответ

0 голосов
/ 25 августа 2010

вы на самом деле не следуете передовым методам разработки приложений MVC.

Об ошибке: Html.DropDownList ищет данные типа IEnumerable<SelectListItem> в модели, но вместо этого находит int (DepartmentId)

ваш ViewModel не должен иметь метод MapTo, он нарушает принцип единой ответственности

в вашем методе действия вы не проводите проверку на стороне сервера, например:

if(!ModelState.IsValid)
{
   //rebuild the viewmodel and return the view
}

ловить все в действии тоже не нужно (и плохо) Вы делаете это в Global.asax Application_Error вместо

атрибуты, такие как HiddenInput, ScaffoldColumn, Validation и все, что связано с пользовательским интерфейсом, должны быть на вас ViewModel, а не в вашей доменной модели


хороший пример использования viewmodels & validation & mapping между entity <-> viewmodel Я рекомендую вам посмотреть решение Samples из здесь

Я сделал этот пример, и его основная цель - продемонстрировать использование ValueInjecter (технология отображения)

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