2013-03-21 3 views
0

viewmodel에 문제가 있습니다. 나는 방법을 만들고, 포스트 인 방법을 만든다. 내 viewmodel에서 ProjectModel과 ActivityLogModel의 두 클래스를 보냈습니다. 내가 겪고있는 문제는 아래의 오류입니다. ProjectViewModel로 데이터를 다시 원하지만 ProjectModel에서 가져온 데이터입니다. 데이터를 올바른 유형으로 반환하도록이 문제를 어떻게 해결합니까?MVC에서 잘못된 유형이 반환되었습니다.

사전에 전달 모델 항목 유형 'GlobalNaming.Models.ProjectModel'의이지만,이 사전은 유형의 모델 항목 'GlobalNaming.Models.ProjectViewModel'을 필요로한다.

첫 metod 당신 returnProjectViewModel에서와 secund metod의 뷰 모델

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

를 클래스 정의와 같은 이름을보기 (오후) 반환하지 마십시오 '<- 그건'ProjectViewModel'이 아닙니다. –

+0

당신의 변수 – jrummell

답변

0

.

왜 ViewModel의 도메인 모델을 속성으로 사용하고 있습니까? 이렇게하면 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" /> 
} 

및 바인딩 MVC 모델은 그에 게시 된 양식 변수를 바인딩 할 수 있도록 형식 ProjectVM의 매개 변수가됩니다 HttpPost 액션 메소드. ?.

[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

당신은 ProjectModel을 반환합니다. 따라서 둘 중 하나를 병합하여 동일하게 사용하거나 다른보기를 만들 수 있습니다. 보기에

이보기 만 나는 당신의 ProjectViewModel 당신은 또한을 바꿀 수 있도록 ProjectModel에 대한 속성을 가지고 보았다 ProjectModel

종류와 개체를 받아 들일 것을 의미합니다

@Model ProjectModel 

이 돌아 가기 :

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

게시 작업에서 잘못된 유형이 반환됩니다. 아래를 참조

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

사실, 문제는 HttpPost Create 방법의 입력 매개 변수 ProjectModel pm 매개 변수입니다.

HttpGet CreateProjectViewModel을 렌더링 했으므로 ProjectModel이 아닌 게시판에 게시됩니다. 그래서 GET 요청에 렌더하는 타입을 정렬하고 포스트 핸들러의 입력 매개 변수에 입력하십시오.

이 작동합니다 : 그것은 당신이 액션 메소드에서 몇 가지 유형을 보내는 양식이 다른 유형을 기대하고 오류 메시지는 매우 분명하다

[HttpPost] 
    public ActionResult Create(ProjecViewtModel pvm, HttpPostedFileBase files) 
    { 
     // TODO: 
관련 문제