2011-02-22 76 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的可以處理它並返回該財產清單正確

相關問題