2016-10-03 61 views
1

我想我已经读过关于此的每一篇文章,但仍不知道为什么下面的强制键入模型的自定义编辑器模板根本不显示。它肯定正在执行Recipient.cshtml模板编辑器,因为我在TextboxFor行上放置了一个断点,并且该行命中了两次,一次用于在Controller中设置的每个收件人名称,但是当它完成时,页面显示为空模型项目(主页面上的提交按钮仍然显示)。如果我取消注释RenderPartial行,并注释掉EditorFor,那么收件人显示效果会很好,但当然ID没有正确列举,因此我无法发布。据我所知,我必须使用编辑器模板为了正确列举ID并允许发布收件人模型。强类型编辑器模板不显示

任何人都可以看到我可能做错了或建议一种替代方法来呈现此列表与正确的ID?

谢谢!

型号:

[DataContract(Name = "recipient")] 
public class Recipient 
{ 
    [Display(Name = "Email")] 
    public string eMail { get; set; } 

    [Display()] 
    public string Name { get; set; } 
} 

控制器:

[HttpGet] 
public ActionResult CreateRecipients() 
{ 
    var recp = new List<Recipient>(); 
    recp.Add(new Recipient()); 
    recp[0].Name = "VTest"; 
    recp[0].eMail = "[email protected]"; 
    recp.Add(new Recipient()); 
    recp[1].Name = "GTest"; 
    recp[1].eMail = "[email protected]"; 

    return this.View(recp); 
} 

EditorTemplate:

@model Recipient 
    <div class="row"> 
     <div class="col-md-4"> 
      <div class="row"> 
       <div class="col-xs-12 custom-label-left-condensed"> 
        @Html.LabelFor(model => Model.Name) 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-12"> 
        @Html.TextBoxFor(model => Model.Name) 
       </div> 
      </div> 
     </div> 
     <div class="col-md-4"> 
      <div class="row"> 
       <div class="col-xs-12 custom-label-left-condensed"> 
        @Html.LabelFor(model => Model.eMail) 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-12"> 
        @Html.EditorFor(model => Model.eMail, new { htmlAttributes = new { @class = "emailField" } }) 
       </div> 
      </div> 
     </div> 
    </div> 

查看:

@model List<Recipient> 

<div class="panel panel-default"> 
    <div class="panel-heading hidden-xs"> 
     <h4>@ViewBag.Title</h4> 
    </div> 

    @using (Html.BeginForm()) 
    { 
     <div class="container-fluid panel-body"> 
      <div id="myData"> 
       @if (Model != null) 
       { 
        for (int i = 0; i < Model.Count(); i++) 
        { 
         Html.EditorFor(m => Model[i], "Recipient", "Recipient[" + i + "]"); 
         //Html.RenderPartial("EditorTemplates/Recipient", Model[i]); 
        } 
       } 
      </div> 
      <div class="row"> 
       <div class="col-xs-4 col-md-3 text-right"> 
        <input id="cmdSubmit" type="submit" value="Create" class="btn btn-default btn-sm" /> 
       </div> 
      </div> 
     </div> 
    } 
</div> 
+0

是吧'Recipient'或'Recipients'?你在你的代码中使用了两个,但是这两个完全不同的类名。 –

+0

在模型下我定义了收件人,单数,然后复数作为收件人:列表。该视图使用复数和模型for循环,并在for循环中,我称EditorTemplate为单数。 – VG1

+0

我明白了。但这实际上并不是一个好主意。它不仅会让你的代码更难阅读,而且会造成一个失败点。您多久会在Visual Studio中使用错误的自动补全?我会经常想象。另外,它在像C#这样的强类型语言中非常重要,可以知道你正在处理的是哪种类型的集合。 '收件人'可以是'List ','ICollection ','IEnumerable ','Recipient []'等等中的任何一个。不得不深入研究这个类来确定代码味道。 –

回答

0

使用

List<recp> recps = new List<Recipients>(); 
recp orecp = new recp(); 

orecp.Name = "VTest"; 
orecp.eMail = "[email protected]"; 
recps.add(orecp); 

orecp = new recp(); 
orecp.Name = "GTest"; 
orecp.eMail = "[email protected]"; 
recps.add(orecp); 

return this.View(recps); 
+0

谢谢埃米尔,我已经更新了我的控制器,但这没有什么区别。收件人绝对是人口稠密的。当我正在调试并在“@ Html.TextBoxFor(model => Model.Name)”中找到断点时,这个名字对两个记录都显示正常。然而,没有任何东西呈现给页面。 – VG1