我的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);
}
答案 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
}