我在一段时间内遇到过viewmodels的问题,我想澄清一些问题。在我的viewmodel中,我可以显示“index”,我可以添加一个新员工“创建”,但“编辑”不起作用。
我可以显示“编辑”页面,进行我的编辑(比如更改名称),但当我回发时,所有数据都会显示为 null 。在“创建”中,在我发布插入后,控制器显示更改(EmployeeViewModel)并插入记录。它只是没有显示何时进行“编辑”。
这是viewmodel中固有的东西还是其他东西?
这是我的viewmodel类(数据库优先):
public partial class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public Nullable<int> DepartmentId { get; set; }
public string Address { get; set; }
public virtual Department Department { get; set; }
}
public partial class Department
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Department()
{
this.Employees = new HashSet<Employee>();
}
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Employee> Employees { get; set; }
}
public class EmployeeViewModel
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public Nullable<int> DepartmentId { get; set; }
public string Address { get; set; }
public string DepartmentName { get; set; }
}
这是我的控制器:
public class TestController : Controller
{
public db dContext = new db();
public ActionResult Index()
{
List<Employee> employeelist = dContext.Employees.ToList();
EmployeeViewModel employeeVM = new EmployeeViewModel();
List<EmployeeViewModel> employeeVMList = employeelist.Select(x => new EmployeeViewModel
{
Name = x.Name,
EmployeeId = x.EmployeeId,
Address = x.Address,
DepartmentId = x.DepartmentId,
DepartmentName = x.Department.DepartmentName
}).ToList();
return View(employeeVMList);
}
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create( EmployeeViewModel employeeVM)
{
if (ModelState.IsValid)
{
Employee e = new Employee();
e.EmployeeId = employeeVM.EmployeeId;
e.Name = employeeVM.Name;
e.DepartmentId = employeeVM.DepartmentId;
e.Address = employeeVM.Address;
dContext.Employees.Add(e);
dContext.SaveChanges();
return RedirectToAction("Index");
}
return View("Index");
}
public ActionResult Edit( EmployeeViewModel em , int? id)
{
var dbEmpVM = (from e in dContext.Employees
join d in dContext.Departments
on e.DepartmentId equals d.DepartmentId
where e.EmployeeId == id
select new EmployeeViewModel
{
EmployeeId = e.EmployeeId,
DepartmentId=e.DepartmentId,
Address=e.Address,
Name=e.Name,
DepartmentName=d.DepartmentName
}).ToList();
return View( dbEmpVM );
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(EmployeeViewModel model, int id)
{
string name = Request.Form["EmployeeId"];
string naaanm = model.EmployeeId.ToString();
return RedirectToAction("Index");
}
}
这是我的编辑:
@model IEnumerable<MVCTutorial.Models.EmployeeViewModel>
@{
ViewBag.Title = "Edit";
}
<h4>(EmployeeViewModel)</h4>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
foreach (var item in Model)
{
<div class="form-group">
@Html.LabelFor( i => item.EmployeeId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(i => item.EmployeeId, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(i => item.EmployeeId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(i => item.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(i => item.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(i => item.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(i => item.DepartmentId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(i => item.DepartmentId, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(i => item.DepartmentId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(i => item.DepartmentName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(i => item.DepartmentName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(i => item.DepartmentName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(i => item.Address, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(i => item.Address, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(i => item.Address, "", new { @class = "text-danger" })
</div>
</div>
}
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Edit" class="btn btn-default" />
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
答案 0 :(得分:0)
您当前的代码(在编辑视图中)将生成如下的输入标记。
<input class="form-control text-box single-line"
id="item_DepartmentName" name="item.DepartmentName" type="text" value="SomeName" />
请参阅name属性值。它是"item.DepartmentName"
。您的HttpPost操作方法参数是EmployeeViewModel
类型,它没有具有此名称的属性!因此,模型绑定器将无法使用此名称("item.DepartmentName"
)将表单中发布的表单数据映射到方法参数的任何属性。
解决方案是更新输入字段的名称属性值,以匹配EmployeeViewModel
的属性名称。理想情况下,您的代码应生成如下所示的标记。
<input name="DepartmentName" type="text" value="Some value" />
您可以在调用html帮助程序时明确指定name
属性。例如,使用Html.TextBoxFor
帮助程序
@Html.TextBoxFor(i => item.DepartmentName,
new { @class = "form-control", NAME = "DepartmentName" })
现在,当您提交表单时,Model binder将能够将此表单字段的值映射到DepartmentName
对象的EmployeeViewModel
属性。