0

我的视图模型遇到了一些问题。我有一个 create 方法,并且 create 方法是 post。在我的视图模型中,我发送了两个类 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

4 回答 4

1

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

return View(new ProjectViewModel { Project = pm });
于 2013-03-21T20:07:24.640 回答
0

在第一个方法中你returna ProjectViewModel,在第二个方法中你返回 a ProjectModel。因此,要么合并它们并尝试使用相同的视图,要么创建不同的视图。

在你看来你有

@Model ProjectModel

这意味着这个视图将只接受类型为ProjectModel

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

return View(new ProjectViewModel { Project = pm })
于 2013-03-21T20:05:51.830 回答
0

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

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

这会起作用:

[HttpPost]
    public ActionResult Create(ProjecViewtModel pvm, HttpPostedFileBase files)
    {
        // TODO:
于 2013-03-21T20:09:29.083 回答
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);
}

现在确保您的 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
}
于 2013-03-21T20:10:48.123 回答