【发布时间】: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 都返回。这是我所知道的:
- 更改数据库没有影响
- 保存用户始终有效
- 仅当用户数为 等于或小于分支数
- 删除用户的“editorfor”允许保存分支,即使存在更多用户
- 用户比分支少,用户仍然保存
- 交换两个“editorfor”没有区别
- 在视图模型中交换两个 iList 没有区别
- 我尝试通过添加一个数字使两个编辑器模板不同 “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