Проблема с Html.DropDownList AutoMapper

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

Элемент 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>

person obautista    schedule 25.08.2010    source источник


Ответы (1)


вы на самом деле не следуете лучшим практикам разработки приложения 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, а не в вашей модели предметной области


чтобы получить хороший пример использования моделей просмотра и проверки и сопоставления между объектами ‹-> моделями просмотра, я рекомендую вам взглянуть на решение «Примеры» из здесь

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

person Omu    schedule 25.08.2010