MVC中返回的类型不正确

时间:2013-03-21 20:00:22

标签: c# asp.net-mvc

我的viewmodel遇到了一些问题。我有一个create方法,并创建post的方法。在我的viewmodel中,我发送了两个类ProjectModel和ActivityLogModel。我遇到的问题是下面的错误。它希望数据作为ProjectViewModel返回,但数据来自ProjectModel。如何更正此问题,以便将数据作为正确的类型返回。

  

传递到字典中的模型项是类型的   'GlobalNaming.Models.ProjectModel',但是这个字典需要一个   “GlobalNaming.Models.ProjectViewModel”类型的模型项。

视图模型

    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);
    }

4 个答案:

答案 0 :(得分:1)

您在后期操作中返回了错误的类型。见下文:

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

答案 1 :(得分:0)

在第一个方法中,您return ProjectViewModel并在secund metod中返回ProjectModel。因此要么合并它们并尝试使用它们,要么创建不同的视图。

在你看来,你有

@Model ProjectModel

这表示此视图仅接受类型为ProjectModel

的对象

我看到您的ProjectViewModel具有ProjectModel的属性,因此您也可以将返回更改为:

return View(new ProjectViewModel { Project = pm })

答案 2 :(得分:0)

实际上,问题是HttpPost ProjectModel pm方法的输入参数Create参数。

您在HttpGet ProjectViewModel中呈现了Create,这就是回发的内容,而不是ProjectModel。因此,只需对齐您在GET请求上呈现的类型,并在Post处理程序中输入params中预期输入类型。

这样可行:

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

答案 3 :(得分:0)

从错误消息中可以清楚地看到,您正在从action方法发送一些类型,并且表单期望使用不同的类型。

为什么在ViewModel中使用域模型作为属性?这将使您的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);
}

现在确保您的View强烈输入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
}