我有一个使用Entity Framework作为Model层的MVC3应用程序。
在EmployeeController中,我有:
public ActionResult GetEmployeeEdit(String id)
{
// Get the desired Employee
var model = GetEmployees().FirstOrDefault(o=>o.EFolderid == id);
return View("EmployeeEdit", model);
}
private IQueryable<Employee> GetEmployees()
{
// Returns IQueryable<Employee>
return _employeeService.GetTable();
}
在EmployeeEdit中我有:
@model Metastorm.Domain.Models.Employee
@{
ViewBag.Title = "Employee Edit";
}
@using (Html.BeginForm("SaveEmployee", "Employee", FormMethod.Get, Model))
{
<fieldset>
<legend>Edit Employee</legend>
<br />
@Html.Label("firstName", "First Name: ")
@Html.EditorFor(o => @Model.NameFirst)
<br />
@Html.Label("lastName", "Last Name: ")
@Html.EditorFor(o => @Model.NameLast)
</fieldset>
<br />
<input class="button" id="submit" type="submit" value = "Save Employee" />
}
现在回到EmployeeController:
[HttpGet]
public ActionResult SaveEmployee(Employee employee)
{
if (ModelState.IsValid)
{
// Get the Employee Model again from Entity, Update and save
// Unfortunately, the employee object's FolderId value is null
}
// Just getting a model to satisfy the function
var model = GetEmployees().FirstOrDefault();
return View("EmployeeEdit", model);
}
我遇到的问题是employee对象上的所有属性都为null,但Employee.NameFirst和Employee.NameLast除外,这些属性恰好是在View with Html.EditorFor中公开的属性。
总之,我得到了一个完全水合的Employee模型对象。我将此模型从Controller传递给视图。在视图中,允许更新选定的字段。然后将Employee模型传递回Controller,持续更新。
我的问题是如何将最初从Controller传递给View的Employee模型保持不变。换句话说,我想拥有模型
答案 0 :(得分:1)
尝试使用此代码:
[HttpGet]
public ActionResult SaveEmployee([Bind(Include = "NameFirst,NameLast,EFolderid")] Employee employee)
{
if (ModelState.IsValid)
{
// Do your staff
// The employee object's FolderId value will be not null
}
// Just getting a model to satisfy the function
var model = GetEmployees().FirstOrDefault();
return View("EmployeeEdit", model);
}
这将强制对象员工的数据成员“NameFirst,NameLast,EFolderid”持久化。您需要在include语句中声明要在Http请求期间保留的所有成员。
您还应该在视图中,在Form中添加此代码,否则EFolderid数据将丢失:
@Html.HiddenFor(o=> @Model.EFolderid)
添加要保留的“HiddenFor”声明foreach成员。
答案 1 :(得分:0)
要在Post操作中获取模型属性,您需要包含表单内的所有属性。 正确的模型序列化是必要的。
答案 2 :(得分:0)
我走了另一条路。我创建了一个视图模型,然后使用AutoMapper将Employee对象的属性映射到视图模型。我将视图模型传递给视图,进行更改,然后将视图模型传递回Action。然后,我可以使用AutoMapper将视图模型映射回Employee对象的新实例,然后保留更改。