【问题标题】:IList's not being Posted Back in viewmodelIList 未在视图模型中回发
【发布时间】:2015-12-21 16:44:43
【问题描述】:

我有一个 MVC 页面正在做一些奇怪的事情。我有一个包含两个 IList、Branches 和 Users 的类。

public class ThirdPartyViewModel
{
    public String MessageText { get; set; }
    public BranchAddress Address { get; set; }
    public String AddressBranchCode { get; set; }
    public String FullAddressBlock { get; set; }

    public IList<ThirdPartySubUserLine> ThirdPartyUsers { get; set; }
    public IList<ThirdPartyBranch> ThirdPartyBranches { get; set; }
    public String BrandStyle { get; set; }
}

该视图包含 2 个选项卡和 2 个带有模板的 EditorFor

<div id="tabContainer" class="container">  
    <ul class="tabs">  
	    <li class="tab-link current" data-tab="tab1">Users</li>
	    <li class="tab-link" data-tab="tab2">Branches</li>
    </ul>  
  
        <div id="tab1" class="tab-content current">  
	    <table>
        <tbody id="mainList" style="display: block; overflow: auto;">
            @Html.EditorFor(m => m.ThirdPartyUsers, new { editor = "users" })           
        </tbody>
        </table>
    </div>

    <div id="tab2" class="tab-content">
	    <table>
        <tbody id="mainListSec"  style="display: block; overflow: auto;">
            @Html.EditorFor(t => t.ThirdPartyBranches, new { editor = "data" })
        </tbody>
        </table>
    </div>
        <input id="btnSave" name="Save" type="submit" title="SAVE" />
</div>

2x 模板如下所示:

@model MVC.Controllers.ThirdPartyController.ThirdPartyBranch

<tr style="vertical-align: top;" lineType="@(ViewData["editor"])">
	<td style="width: 200px; text-align: left; font-size: x-small;">
        @Html.HiddenFor(t => t.Changed, new { @class = ViewData["editor"] + "RowChanged", value="false" })

        @(Model.BranchText)

        @Html.HiddenFor(t => t.BranchText, new { @class="br_name" })
    </td>
	<td style="width: 120px; text-align: left; font-size: x-small;">
        @Html.DisplayFor(t => t.BranchTown)
        @Html.HiddenFor(t => t.BranchTown, new { @class="br_town" })
    </td>
	<td style="width: 80px; text-align: center; font-size: x-small;">
        @Html.DisplayFor(t => t.BranchPostalCode)
        @Html.HiddenFor(t => t.BranchPostalCode, new { @class="br_postcode" })
    </td>
	<td style="width: 80px; text-align: center; font-size: x-small;">
        @Html.DisplayFor(t => t.Branch)
        @Html.HiddenFor(t => t.Branch, new { @class="br_code" })
    </td>
    <td style="width: 90px; text-align: center;">
            @Html.CheckBoxFor(t => t.isFlaggedAsRetailer, new { @class = "incLabour" })
    </td>
</tr>
第二个模板

@model MVC.Controllers.ThirdPartyController.ThirdPartySubUserLine

<tr style="vertical-align: top;" lineType="@(ViewData["editor2"])">
	<td style="width: 200px; text-align: left; font-size: x-small;">
        @Html.HiddenFor(m => m.Changed, new { @class = ViewData["editor2"] + "RowChanged2", value="false" })
        @Html.DisplayFor(m => m.UserID)
        @Html.HiddenFor(m => m.UserID, new { @class="br_userid" })
    </td>
	<td style="width: 120px; text-align: left; font-size: x-small;">
        @Html.DisplayFor(m => m.UserFirstName)
        @Html.HiddenFor(m => m.UserFirstName, new { @class="br_userfname" })
    </td>
	<td style="width: 80px; text-align: center; font-size: x-small;">
        @Html.DisplayFor(m => m.UserLastName)
        @Html.HiddenFor(m => m.UserLastName, new { @class="br_userlname" })
    </td>
	<td style="width: 90px; text-align: center;">
        @Html.CheckBoxFor(m => m.isFlaggedAsRetailer, new { @class = "allowRetailer" })
    </td>
</tr>

我的问题出在控制器中。我不会一直回发视图模型。

[HttpPost]
[Button(ButtonName = "Save")]
[ActionName("List")]
public ActionResult Save(ThirdPartyViewModel postedViewModel)
{
     //somecode
}

在控制器中,在“保存”ActionResult 下,我并不总是将两个 IList 都返回。这是我所知道的:

  1. 更改数据库没有影响
  2. 保存用户始终有效
  3. 仅当用户数为 等于或小于分支数
  4. 删除用户的“editorfor”允许保存分支,即使存在更多用户
  5. 用户比分支少,用户仍然保存
  6. 交换两个“editorfor”没有区别
  7. 在视图模型中交换两个 iList 没有区别
  8. 我尝试通过添加一个数字使两个编辑器模板不同 “2”在某些地方,没有区别

我希望我提供了足够的信息,以便有人发现我所犯的错误,但如果没有,请询​​问。我希望这是一件愚蠢的事情。我已经看这个太久了。有什么想法吗?




更新:

昨天大部分时间都在看这个。我连接了 Fiddler 并查看了发回的内容。在所有情况下,两个 IList 的详细信息都被回发,但是当您将鼠标悬停在 vs2013 中的回发视图模型上时,分支 IList 在某些条件下为空。如果您查看“Request.Form”,您每次都可以看到结果,所以我做了一个 Dirty Hack(见下文)。通过查看 Fiddler,我还注意到“CheckBoxFor”控件返回“False”或“False,True”,所以我已经处理了。

仍然提出问题为什么?

if (postedViewModel.ThirdPartyBranches != null)
{
  foreach (ThirdPartyBranch item in postedViewModel.ThirdPartyBranches)
  {
    //Do Update;
  }
}
else
{
  if (Request.Form.AllKeys.Contains("ThirdPartyBranch[0].Branch"))
  {
    string LastKey = Request.Form.AllKeys.Where(n => n.StartsWith("ThirdPartyBranch[")).Last();
    int LastKeyNumber = int.Parse(LastKey.Split('[', ']')[1]) + 1;

    for (int b = 0; b < LastKeyNumber; b++)
    {
      string updatebranch = Request.Form["ThirdPartyBranch[" + b.ToString() + "].Branch"].ToString();
      string updateisFlaggedAsRetailer = Request.Form["ThirdPartyBranch[" + b.ToString() + "].isBranchFlaggedAsRetailer"].ToString();
      if(updateisFlaggedAsRetailer.Contains("true"))
      {
        //Do Update to True;
      }
      else
      {
        //Do Update to False;
      }
    }
  }
}

【问题讨论】:

    标签: list model-view-controller razor postback viewmodel


    【解决方案1】:

    您的代码对我来说看起来不错。可以尝试的方法是初始化模型默认构造函数中的两个列表。我之前遇到过一个问题,模型绑定器不会创建列表,但如果它们不为空就会填充它们。

    public class ThirdPartyViewModel
    {
        public String MessageText { get; set; }
        public BranchAddress Address { get; set; }
        public String AddressBranchCode { get; set; }
        public String FullAddressBlock { get; set; }
    
        public IList<ThirdPartySubUserLine> ThirdPartyUsers { get; set; }
        public IList<ThirdPartyBranch> ThirdPartyBranches { get; set; }
        public String BrandStyle { get; set; }
    
        public ThirdPartyViewModel()
        {
            ThirdPartyUsers = new List<ThirdPartySubUserLine>();
            ThirdPartyBranches = new List<ThirdPartyBranch>();
        }
    }
    

    【讨论】:

    • 我总是将 2x 列表填充并显示在屏幕上,但我并不总是将两个列表都发回。谢谢
    • 检查生成的 html 是否具有正确的属性名称,例如:ThirdPartyUsers[0].UserId。我遇到的另一个问题是在提交之前禁用输入字段时,它们不包含在发布数据中。但我看不到你是否禁用了任何项目。
    • 刚刚查看了“查看源代码”。抱歉没有问题。一切都是独一无二的,没有被禁用
    • 您是否尝试将默认构造函数放入模型中以初始化两个列表?这是我使用的模型绑定器的问题,即从视图发布到控制器。
    • 我在答案中添加了一个示例。如果这不能解决问题,则模型绑定器可能存在问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多