在MVC中返回的类型不正确

本文关键字:类型 不正确 返回 MVC | 更新日期: 2023-09-27 18:05:16

我的视图模型有一些麻烦。我有一个创建方法,创建方法是post。在我的视图模型中,我发送了两个类ProjectModel和ActivityLogModel。我遇到的问题是下面的错误。它希望数据作为ProjectViewModel返回,但是数据来自ProjectModel。如何纠正这一点,使数据作为正确的类型返回?

传入字典的模型项类型为"GlobalNaming.Models。ProjectModel',但是这个字典需要

视图模型

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

在MVC中返回的类型不正确

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

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

从错误消息中可以清楚地看出,您正在从action方法发送某种类型,而表单期望的是不同的类型。

为什么在ViewModel中使用域模型作为属性?这将使您的ViewModels与您的域模型紧密耦合。

你应该像这样更新你的视图模型

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
}

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

你渲染ProjectViewModel在HttpGet Create,所以这是什么被发布回来,而不是ProjectModel。因此,只需对齐您在GET请求中呈现的类型和您在Post处理程序中的输入参数中期望的类型。

可以:

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

在第一个方法中,您返回returnProjectViewModel,而在第二个方法中,您返回ProjectModel。所以你要么合并它们并尝试使用相同的视图,要么创建不同的视图。

在你的视图中有

@Model ProjectModel

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

的对象。

我看到你的ProjectViewModel有一个ProjectModel的属性,所以你也可以改变返回到:

return View(new ProjectViewModel { Project = pm })