1

我有一个使用实体框架作为模型层的 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.NameFirst 和 Employee.NameLast,它们恰好是使用 Html.EditorFor 在视图中公开的属性。

总之,我得到了一个 Employee 模型对象,它是完全水合的。我将此模型从控制器传递到视图。在视图中,允许更新选定的字段。然后将 Employee 模型传递回持久更新的控制器。

我的问题是如何保持最初从 Controller 传递到 View 的 Employee 模型完好无损。换句话说,我想要模型

4

3 回答 3

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 请求期间保留的所有成员。

您还应该在您的视图中,在表单中添加此代码,否则 EFolderid 数据将丢失:

@Html.HiddenFor(o=> @Model.EFolderid)

为要保留的每个成员添加“HiddenFor”声明。

于 2015-04-21T17:58:39.193 回答
0

要在 Post 操作中获取模型属性,您需要在表单中包含所有属性。正确的模型序列化是必要的。

于 2012-12-12T15:51:57.067 回答
0

我走了一条不同的路线。我创建了一个视图模型,然后使用 AutoMapper 将 Employee 对象的属性映射到视图模型。我将视图模型传递给视图,进行更改,然后将视图模型传递回 Action。然后我可以使用 AutoMapper 将视图模型映射回 Employee 对象的新实例,然后持久化更改。

于 2015-04-24T16:31:58.603 回答