从视图到控制器的MVC3 Razor传递模型

时间:2012-12-12 14:43:00

标签: asp.net-mvc asp.net-mvc-3 razor

我有一个使用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模型保持不变。换句话说,我想拥有模型

3 个答案:

答案 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对象的新实例,然后保留更改。