MVC4中View不会传回数据给Controller

View will not pass back data to Controller in MVC4

过去 3-4 天我一直在努力寻找答案。我进行了很多搜索,并从已经问过基本相同问题的人那里得到了很多很好的答案。但是,none 的修复对我有用。
这是与工作相关的,因此某些 keywords/names 已更改。我已经逐步完成了程序,控制器正在将列表数据传递给视图,视图正在填充 Display/Textbox 和隐藏字段。但是,返回给控制器的模型具有正确数量的行项目,只是一切都是 0 或 null:

型号

namespace hereismynamespace
{
  public class CommissionCodeModel
  {
    public CommissionCodeModel()
    {
        CommCodes = new List<CommissionListingItem>();
    }

    public List<CommissionListingItem> CommCodes { get; set; }
  }
}

控制器

namespace hereismynamespace
{
  public class CommissionCodeController : Controller
  {
    [HttpGet]
    public ActionResult Manage()
    {
        var model = new CommissionCodeModel();
        var list = CommissionListing.Get(false);
        foreach (CommissionListingItem item in list)
        {
            model.CommCodes.Add(item);
        }
        return View(model);
    }

    [HttpPost]
    public ActionResult SaveData(List<CommissionListingItem> CommCodes)
    {
        //do stuff here

        return View();
    }
  }
}

查看

@using (Html.BeginForm("SaveData", "CommissionCode", FormMethod.Post))
{
<table id="commissionCodesPercentage" class="listing">
  <thead>
        <tr>
            <th>Comm ID</th>
            <th>Comm Code</th>
            <th>Percent</th>
        </tr>
    </thead>
    @for (var i = 0; i < Model.CommCodes.Count; i++)
    {
    <tr>
        <td>@Html.DisplayFor(model => Model.CommCodes[i].CommissionId)
            @Html.HiddenFor(model => Model.CommCodes[i].CommissionId)
        </td>
        <td>@Html.DisplayFor(model => Model.CommCodes[i].Description)
            @Html.HiddenFor(model => Model.CommCodes[i].Description)
        </td>
        <td>@Html.TextBoxFor(model => Model.CommCodes[i].Rate)
            @Html.HiddenFor(model => model.CommCodes[i].Rate)
        </td>
    </tr>
    }
    </table>
    <br /><br />   
    <button id="btnCommissionCodesSave" name="submit"type="submit"value="Save">Save</button>
    <button id="btnCommissionCodesCancel">Cancel</button>

佣金清单项目的定义

[Serializable]
public struct CommissionListingItem
{
 private System.Int32 _CommissionId;
 private System.String _Description;
 private System.Double _Rate;
 public System.Int32 CommissionId{get{return _CommissionId;}}
 public System.String Description{get{return _Description;}}
 public System.Double Rate{get{return _Rate;}}
 public CommissionListingItem(
  System.Int32 CommissionId, 
  System.String Description, 
  System.Double Rate) 
 {
  this._CommissionId = CommissionId;
  this._Description = Description;
  this._Rate = Rate;
 }

模型变量在您的 lambda 表达式中应该是小写的。

@for (var i = 0; i < Model.CommCodes.Count; i++)
{
<tr>
    <td>@Html.DisplayFor(model => model.CommCodes[i].CommissionId)
        @Html.HiddenFor(model => model.CommCodes[i].CommissionId)
        </td>
    <td>@Html.DisplayFor(model => model.CommCodes[i].Description)
        @Html.HiddenFor(model => model.CommCodes[i].Description)
        </td>
    <td>@Html.TextBoxFor(model => model.CommCodes[i].Rate)
        @Html.HiddenFor(model => model.CommCodes[i].Rate)
        </td>
</tr>
}

您的模型属于

类型
CommissionCodeModel

然而,在您的 post 操作中,您需要一个类型为

的模型
List<CommissionListingItem>

因此模型绑定器无法正确绑定到您的控制器模型。

struct 没有 setter,这是问题所在,因为 View 无法设置属性,因此所有属性都使用默认值发布:

[Serializable] 
public struct CommissionListingItem 
{ 
  private System.Int32 _CommissionId; 
  private System.String _Description; private
  System.Double _Rate; 
  public System.Int32 CommissionId
  {
   get
     {
      return _CommissionId;
     }
   set
     {
       _CommissionId = value;
     }
  } 
 public System.String Description
 {
   get
     {
       return _Description;
     }
   set
     {
       _Description = value;
     }
   } 
  public System.Double Rate
  {
   get{return _Rate;}
   set { _Rate = value;}
  } 
}