在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);
}
您在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:
在第一个方法中,您返回return
和ProjectViewModel
,而在第二个方法中,您返回ProjectModel
。所以你要么合并它们并尝试使用相同的视图,要么创建不同的视图。
在你的视图中有
@Model ProjectModel
这意味着该视图将只接受类型为ProjectModel
我看到你的ProjectViewModel有一个ProjectModel的属性,所以你也可以改变返回到:
return View(new ProjectViewModel { Project = pm })