2013-03-21 4 views
0

У меня возникли проблемы с моей моделью просмотра. У меня есть метод create и создайте метод, который является post. В моей модели просмотра я отправляю два класса ProjectModel и ActivityLogModel. Проблема, с которой я столкнулась, - это ошибка ниже. Он хочет вернуть данные как ProjectViewModel, но данные взяты из ProjectModel. Как исправить это, чтобы данные возвращались как правильный тип.Неверный тип, возвращенный в MVC

Модели элемент передается в словарь типа «GlobalNaming.Models.ProjectModel», но этот словарь требует модели элемента типа с 'GlobalNaming.Models.ProjectViewModel.

ViewModel

public List<ProjectModel> Project { get; set; } 
    public List<ActivityLogModel> Activity { get; set; } 

Контроллер

public ActionResult Create() 
    { 
     ProjectViewModel projectvm = new ProjectViewModel(); 
     ProjectModel project = new ProjectModel(); 

     project.ProjectOwner = UserName; 
     project.Description = _description; 
     project.Timing = _timing; 
     project.Availability = _availability; 
     project.Positioning = _positioning; 
     project.Competitor = _competitor; 

     projectvm.Project = project; 

     return View(projectvm); 
    } 

    [HttpPost] 
    public ActionResult Create(ProjectModel pm, HttpPostedFileBase files) 
    { 
     pm.CreatedDate = dtNow; 
     pm.UpdatedDateTime = dtNow; 
     pm.ProjectStatus = "Initiation"; 
     pm.Rejected = false; 

     if (ModelState.IsValid) 
     { 
      db.Projects.Add(pm); 

      db.SaveChanges(); 

      UpdateSupportDocs(pm, files); 

      return RedirectToAction("Index"); 
     } 

     return View(pm); 
    } 
+0

{ '... Создать (ProjectModel ProjectModel, ...'} - Не называйте ваши переменные так же, как определение класса – qJake

+0

Когда происходит ошибка –

+0

'вернуться View (Pm);.? '<- это не' ProjectViewModel' – jrummell

ответ

0

Это ясно из сообщения об ошибке, которое вы отправляете некоторый тип от способа действия и форма ожидает другого типа.

Почему вы используете модель домена в своей ViewModel как свойство? Это сделает ваши ViewModels тесно связанными с вашими доменами.

Вы должны обновить ViewModel как этот

public class ProjectVM 
{ 
    public string ProjectName { set;get;} 
    public string ProjectOwner { set;get;} 
    //and other relevant properties ONLY here 
} 

использовать, чтобы передавать и принимать данные от и к вашему мнению.

public ActionResult Create() 
{ 
    var vm=new ProjectVM(); 
    return View(vm); 
} 

Теперь убедитесь, что ваш вид строго типизирован в Viewmodel. а не модель домена.

@model ProjectVM 
@using(Html.Beginform()) 
{ 
    @Html.TextBoxFor(x=>x.ProjectName) 
    <input type="submit" /> 
} 

и ваш HttpPost метод действия будет иметь параметр типа ProjectVM так, что MVC модель привязки будет связывать размещенную переменную формы для этого.

[HttpPost] 
public ActionResult Create(ProjectVM viewModel) 
{ 
    if(ModelState.IsValid) 
    { 
    //Create domain model object and set the property values and save 
    Project proj=new Project(); 
    proj.Name=viewModel.ProjectName 
    proj.ProjectOwner=viewModel.ProjectOwner; 

    db.Projects.Add(proj); 
    db.SaveChanges(); 
    return RedirectToAction("Created"); 
    } 
    return View(viewModel); //returning your view model object 
} 
0

В первом Metod вы returnProjectViewModel и в одностороннем Metod вы возвращаете ProjectModel. Поэтому либо вы объедините их, либо попытайтесь использовать их, либо создадите разные представления.

На ваш взгляд у вас есть

@Model ProjectModel 

Это означает, что эта точка зрения будет принимать только объект с типом ProjectModel

Я видел, что ваш ProjectViewModel имеет свойство для ProjectModel, чтобы вы могли также изменить вернуться к:

return View(new ProjectViewModel { Project = pm }) 
1

Вы возвращаете неправильный тип в посту. Смотри ниже:

return View(new ProjectViewModel { Project = pm }); 
0

На самом деле, проблема в том, входным параметром ProjectModel pm параметр HttpPost Create метода.

Вы сделали ProjectViewModel в HttpGet Create, так что это то, что отправлено назад, а не ProjectModel. Поэтому просто выровняйте тип, который вы выполняете в запросе GET, и введите, что вы ожидаете во входных параметрах в обработчике Post.

Это будет работать:

[HttpPost] 
    public ActionResult Create(ProjecViewtModel pvm, HttpPostedFileBase files) 
    { 
     // TODO: 
Смежные вопросы