2012-11-29 172 views
0

这是一个非常普遍的问题,但我卡住了!自定义类的模板

我有一个模型类,我想在一个视图中进行编辑:

public class FormFillModel 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 

    public string Sector { get; set; } 
    public List<FormFieldModel> Fields { get; set; } 
} 

我可以编辑字符串属性,但我不能编辑字段属性。

我为它创建了一个编辑器模板。在〜/共享/ editortemplates/FormFieldsListModel.cshtml

@model List&lt;SoruCevapForm.Models.FormFieldModel&gt; 

@foreach (var field in Model) 
{ 
<div class="editor-label"> 
    @Html.Label(field.Text) 
</div> 
<div class="editor-field"> 
    @Html.TextBoxFor(model => field.Val) 
</div> 
<br /> 
} 

终于...

<h2>FillForm</h2> 
@using (Html.BeginForm()) 
{ 
    <fieldset> 
     <legend>@Model.Title</legend> 
     @Html.HiddenFor(model => model.Id) 
     <table> 
      <tr> 
       <td> 
        <div class="display-label"> 
         @Html.DisplayNameFor(model => model.Title) 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 
         @Html.DisplayFor(model => model.Title) 
        </div> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <div class="display-label"> 
         @Html.DisplayNameFor(model => model.Sector) 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 
         @Html.DisplayFor(model => model.Sector) 
        </div> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <div class="display-label"> 
         @Html.DisplayNameFor(model => model.Description) 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 
         @Html.DisplayFor(model => model.Description) 
        </div> 
       </td> 
      </tr> 
     </table> 
    </fieldset> 

    <fieldset> 
     <legend>Fields</legend> 

     @Html.EditorFor(model => model.FieldsList.Fields, "FormFieldsListModel") 

     <p> 
      <input type="submit" value="Submit" /> 
     </p> 
    </fieldset> 

} 

但是当我的帖子...

[HttpPost] 
    public ActionResult FillForm(int id, FormFillModel model) 
    { 
     return RedirectToAction("UserPage"); 
    } 

model.Fields属性为空。

编辑:结果的Html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width" /> 
    <title>FillForm</title> 
    <link href="/Content/site.css" rel="stylesheet"/> 

    <script src="/Scripts/modernizr-2.5.3.js"></script> 

</head> 
<body> 
    <br /> 
    <a href="/Account/Logout">Logout</a> 
    <br /> 


<h2>FillForm</h2> 
<form action="/FormManage/FillForm/1" method="post"> <fieldset> 
     <legend>TestForm2</legend> 
     <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="1" /> 
     <table> 
      <tr> 
       <td> 
        <div class="display-label"> 
         Title 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 
         TestForm2 
        </div> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <div class="display-label"> 
         Sector 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 

        </div> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <div class="display-label"> 
         Description 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 
         TestForm Description 
        </div> 
       </td> 
      </tr> 
     </table> 
    </fieldset> 
    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
    <label for="FieldsList_Fields__0__Name">Name</label> 
</div> 
<div class="editor-field"> 
    <input id="FieldsList_Fields__0__Val" name="FieldsList.Fields.[0].Val" type="text" value="" /> 
</div> 
<br /><div class="editor-label"> 
    <label for="FieldsList_Fields__1__Surname">Surname</label> 
</div> 
<div class="editor-field"> 
    <input id="FieldsList_Fields__1__Val" name="FieldsList.Fields.[1].Val" type="text" value="" /> 
</div> 
<br /><div class="editor-label"> 
    <label for="FieldsList_Fields__2__Address">Address</label> 
</div> 
<div class="editor-field"> 
    <input id="FieldsList_Fields__2__Val" name="FieldsList.Fields.[2].Val" type="text" value="" /> 
</div> 
<br /> 

     <p> 
      <input type="submit" value="Submit" /> 
     </p> 
    </fieldset> 
</form> 
<p> 
    <a href="/FormManage/UserPage">Back</a> 
</p> 


    <script src="/Scripts/jquery-1.7.1.js"></script> 


</body> 
</html> 

我该怎么办?

回答

1

尝试使用在你的editortemplate索引访问,同时迭代列表:

@for (int i=0; i<Model.Count(); i++) 
{ 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => Model[i].Val) 
    </div> 
} 

这将使名称与所需要的模型绑定器将值绑定像Fields[0].ValFields[1].Val输入字段的索引一个列表属性。

编辑 我发现了一个矛盾在视图/型号:

模型有一个属性calld Fields。但在你看来,你写了模型。 FieldsList .Fields`:

@Html.EditorFor(model => model.FieldsList.Fields, "FormFieldsListModel") 

这怎么可能?你认为什么是确切的视图模型? 额外FieldsList呈现错误的字段名称,因此它不能绑定到字段您的模型的属性回发。

+0

但我没有使用DefaultModelBinder。有趣的是,对于HttpGet,编辑器模板正在工作。我的意思是,当我展示形式时,这是有效的。但是当我发布时,模型对象返回空属性。 – hakan

+0

@piedpiper我认为你正在使用它 - 但尽管如此,我还没有把你的问题读到最后。我已经完全重写了我的答案。请再检查一次。 – Jan

+0

它没有工作...我试图找到一种替代方法... – hakan