【发布时间】:2016-12-21 13:24:38
【问题描述】:
在我的 MVC 应用程序中,我有一个如下所示的模型类
public class PROJECT
{
[Display(Name = "Project No.")]
public string PROJECT_NO { get; set; }
[Display(Name = "Title")]
[DataType(DataType.MultilineText)]
[Required]
public string TITLE { get; set; }
[Display(Name = "Description")]
[DataType(DataType.MultilineText)]
public string DESCRIPTION { get; set; }
[Display(Name = "Remarks")]
public string REMARKS { get; set; }
}
我有一个像这样的 ViewModel
public class ProjectViewModel
{
public PROJECT Project { get; set; }
public bool IsSelected { get; set; }
public COMPANY Companies { get; set; }
public CLIENT Clients { get; set; }
}
ViewModel 是我为其创建控制器和视图的模型。我还创建了索引、详细信息、删除和创建视图。索引、详细信息和删除视图工作正常,但创建控制器模型绑定似乎不起作用。作为控制器 Create 的输入的 ProjectViewModel 对象为空。如何将 ViewModel 作为参数绑定到该对象?
// POST: /Project/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ProjectViewModel project)
{
if (ModelState.IsValid)
{
db.PROJECTs.Add(project.Project);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.CLIENT_ID = new SelectList(db.CLIENTs, "ID", "NAME", project.Project.CLIENT_ID);
ViewBag.COMPANY_ID = new SelectList(db.COMPANies, "ID", "NAME", project.Project.COMPANY_ID);
return View(project);
}
这里是创建视图
@model IMCCBluePrints.Models.ProjectViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>PROJECT</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.Project.PROJECT_NO, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Project.PROJECT_NO)
@Html.ValidationMessageFor(model => model.Project.PROJECT_NO)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Project.TITLE, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Project.TITLE)
@Html.ValidationMessageFor(model => model.Project.TITLE)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Project.DESCRIPTION, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Project.DESCRIPTION)
@Html.ValidationMessageFor(model => model.Project.DESCRIPTION)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Project.REMARKS, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Project.REMARKS)
@Html.ValidationMessageFor(model => model.Project.REMARKS)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Project.COMPANY_ID, "COMPANY_ID", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("COMPANY_ID", String.Empty)
@Html.ValidationMessageFor(model => model.Project.COMPANY_ID)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Project.CLIENT_ID, "CLIENT_ID", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("CLIENT_ID", String.Empty)
@Html.ValidationMessageFor(model => model.Project.CLIENT_ID)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
【问题讨论】:
-
您发布的视图在哪里
-
@AhmedRagheb 刚刚添加了它.. 请查看更新后的问题
-
您应该在 Html.BeginForm 中明确定义模型参数,如下所示:@using (Html.BeginForm("Create", "Project", FormMethod.Post, new { project = Model }))
-
骗子解释了这个问题,但你在这里做的是糟糕的做法。视图模型不包含属于数据模型的属性。它包含您要在视图中显示/编辑的
Project的每个属性,以及每个下拉列表的IEnumerable<SelectListItem>属性。请参阅What is ViewModel in MVC?。并查看特定属性([Display]等不属于您的数据模型 - 它们进入视图模型)。 -
而且您的下拉列表甚至不能正确地 2 向绑定到任何东西,并且不会为您提供客户端验证(请参阅 this answer 了解如何生成您的下拉列表)
标签: c# asp.net-mvc asp.net-mvc-5 viewmodel