MVC viewmodel编辑在Httppost之后没有显示任何内容

时间:2016-12-22 17:19:10

标签: asp.net-mvc-viewmodel

我在一段时间内遇到过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")
}

EmployeeViewModel

1 个答案:

答案 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属性。