2011-02-22 46 views
0

我有一个有两个对象的模型,一个是带有验证和属性的类来描述一个新员工,第二个是可能需要授予新员工的可能访问列表。如何在包含列表的mvc 2中创建表单?

public class EmployeeViewModel 
{ 
    public NewEmployee.Models.EmployeeModel Employee { get; set; } 
    public IList<RequestedAccessViewModel> AvailibleAccesses { get; set; } 
} 
public partial class EmployeeModel 
{ 
    public DateTime DateRequested { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Initials { get; set; } 
    public string UserName { get; set; } 
    public string Department { get; set; } 
    public string RequestedLocation { get; set; } 
    public string CubicleNumber { get; set; } 
    public string Supervisor { get; set; } 
    public DateTime StartDate { get; set; } 
    public string EmployeeJobFunction { get; set; } 
    public int Id { get; set; } 
} 
public class RequestedAccessViewModel 
{ 
    public string Description { get; set; } 
    public bool Requested { get; set; } 
    public string Comments { get; set; } 
    public int Id { get; set; } 
} 

我的控制器看起来是这样的,刚刚创建了一个新的实例,并创建列表条目,有的拖欠员工的属性值。

[HttpGet] 
public ActionResult Create() 
{ 
    return View(EmployeeViewModel.NewEmployee()); 
} 

视图看起来像这样:

<% using (Html.BeginForm()) {%> 
<%: Html.ValidationSummary(true) %> 
<% Html.RenderPartial("CreateEmployeeData", Model.Employee); %> 
<% 
    foreach (var access in Model.AvailibleAccesses) 
    { 
     Html.RenderPartial("CreateRequestedAccessViewModel", access); 
    } 
%> 
<input type="submit" value="Create" /> 

<%}%>

形式渲染确定,我看到的雇员数据的局部视图,并且为12的局部视图访问列表。不幸的是,当创建按钮被点击并且页面发布时,模型会返回空属性。

[HttpPost] 
public ActionResult Create(EmployeeViewModel model) 
{ 
    // "model" is not null, but it's two properties are! 
} 

如果你看的Request.Form,它看起来像这样:

DateRequested=2%2f22%2f2011+12%3a47%3a22+PM& 
FirstName=& 
LastName=& 
Initials=& 
UserName=& 
Department=& 
RequestedLocation=& 
CubicleNumber=& 
Supervisor=asawyer& 
StartDate=2%2f25%2f2011+12%3a47%3a22+PM& 
EmployeeJobFunction=& 
Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0&Id=0& 
Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false&Requested=false& 
Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments=&Comments= 

这是很显然这是不是这样做的方法。那么我的问题是,创建这种表单的正确方法是什么?

我的尝试是否有缺陷,应该报废并重新开始?

回答

2

尝试使用一个编辑器模板:

<% using (Html.BeginForm()) {%> 
    <%: Html.ValidationSummary(true) %> 
    <% Html.RenderPartial("CreateEmployeeData", Model.Employee); %> 
    <%: Html.EditorFor(x => x.AvailibleAccesses) 
    <input type="submit" value="Create" /> 
<% } %> 

和内部~/Views/Shared/EditorTemplates/RequestedAccessViewModel.ascx

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.RequestedAccessViewModel>" 
%> 
<div> 
    <%: Html.LabelFor(x => x.Description) %> 
    <%: Html.TextBoxFor(x => x.Description) %> 
</div> 
... 

现在,这应该被正确绑定:

[HttpPost] 
public ActionResult Create(EmployeeViewModel employee) 
{ 
    ... 
} 

由于编辑器模板将针对集合中的每个元素进行呈现,因此您可能需要将一些项目添加到您正在传递GET操作(EmployeeViewModel.NewEmployee)的此集合中。

+0

花了一段时间来研究细节,但现在它正常工作,再次感谢Darin。 – asawyer 2011-02-23 16:01:48

0

我认为你遇到的问题是,在一种形式中,你有多次渲染相同的字段。在HTML中,你被允许这样做,但只有当你使用了正确的符号是这样区分的字段:

<form> 
    <input type="text" name="requested[]" /> 
    <input type="text" name="requested[]" /> 
    ... 
</form> 

然后,大多数服务器端语言允许您引用正确的在后数据“要求”通过索引如:posdata [requested] [0](伪代码)。如果你的html输出看起来不像这样,那么你将不得不想出另外一种方式来渲染你的表单。一旦你这样做,问题是,默认与否ModelBinder的可以处理它并返回该财产清单正确

相关问题