代码之家  ›  专栏  ›  技术社区  ›  Baxter

将带有List<T>的视图模型发布到控制器操作方法

  •  1
  • Baxter  · 技术社区  · 11 年前

    我知道有很多关于这方面的帖子,其中大部分我读了一上午,也试了一整天,但仍然无法奏效。

    我有这样一个视图模型:

    namespace GrantTracker.ViewModels
    {
        public class CoverPageViewModel
        {
            public List<Compliance> Compliances { get; set; }
        }
    }
    

    我有一个使用视图模型的局部视图:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<GrantTracker.ViewModels.CoverPageViewModel>" %>
    
    <%
    for (var i = 0; i < Model.Compliances.Count; i++)
    { %>               
            <%=Html.HiddenFor(x => x.Compliances[i].ComplianceId) %>
            <%=Html.TextBoxFor(x => x.Compliances[i].ComplianceName) %>                 
    
    <% } %>
    

    这将正确显示文本框及其值:

    enter image description here

    生成的源看起来不错:

    <input id="Compliances_0__ComplianceId" name="Compliances[0].ComplianceId" type="hidden" value="1" />
    <input id="Compliances_0__ComplianceName" name="Compliances[0].ComplianceName" type="text" value="Human Subjects" />                 
    
    <input id="Compliances_1__ComplianceId" name="Compliances[1].ComplianceId" type="hidden" value="2" />
    <input id="Compliances_1__ComplianceName" name="Compliances[1].ComplianceName" type="text" value="Vertebrate Animals" />                 
    
    <input id="Compliances_2__ComplianceId" name="Compliances[2].ComplianceId" type="hidden" value="3" />
    <input id="Compliances_2__ComplianceName" name="Compliances[2].ComplianceName" type="text" value="Hazardous Substances" />  
    

    当我提交页面时,我可以判断出文本框财产已正确发布:

    Compliances[0].ComplianceId:1
    Compliances[0].ComplianceName:Human Subjects
    Compliances[1].ComplianceId:2
    Compliances[1].ComplianceName:Vertebrate Animals
    Compliances[2].ComplianceId:3
    Compliances[2].ComplianceName:Hazardous Substances
    

    然而,当在控制器操作中访问时,这些值都消失了

    [HttpPost]
    public ActionResult SaveCoverPage(CoverPageViewModel coverPageViewModel)
    {
        return Content(coverPageViewModel.Compliances[0].ComplianceId.ToString());
    }
    

    调试器显示它知道它应该包含三个Compliance对象。
    然而,当向下钻取时,它们都没有它们的值:

    enter image description here

    如果能提供任何帮助,我们将不胜感激。我真的被这件事困住了。

    1 回复  |  直到 11 年前
        1
  •  2
  •   Saranga    11 年前

    更改您的 Compliance 类别如下。

    public class Compliance
    {
        public int ComplianceId { get; set; }
        public string ComplianceName { get; set; }
    }
    

    您应该正确定义财产。