问题描述
我在 viewmodel 中有一个简单的 <int,bool>
字典 TopologiesEnabled
可以更新
public class ManagedIpviewmodel
{
public int Id { get; set; }
public Dictionary<string,Dictionary<SiteEnvironment,int>> TopologiesPerClientPerSiteEnv { get; set; }
public Dictionary<int,bool> TopologiesEnabled { get; set; }
public ManagedIpviewmodel()
{
TopologiesPerClientPerSiteEnv = TopologyService.Instance.GetQueryableNoTracking(t => !t.IsDeleted)
.GroupBy(t => t.ClientShortName)
.ToDictionary(g => g.Key,g => g
.ToDictionary(gg => gg.SiteEnvironment,gg => gg.Id)
);
// flatten everything to just get all topologiegroepen ID's. Set everything to not selected by default
TopologiesEnabled = TopologiesPerClientPerSiteEnv.SelectMany(tpcps => tpcps.Value.Select(kvp => kvp.Value)).ToDictionary(i => i,i => false);
}
}
假设初始化的 TopologiesEnabled
属性字典有 { { 1,false},{2,false} }。
在我的 edit.cshtml 中,表单中有以下代码:
@foreach (var clientTopologiesPerSiteEnv in Model.TopologiesPerClientPerSiteEnv)
{
<div class="form-group">
<label class="control-label col-sm-3">@(clientTopologiesPerSiteEnv.Key):</label>
@{
var topologiesPerSiteEnv = clientTopologiesPerSiteEnv.Value;
}
@foreach (var selectableSiteEnvironment in selectableSiteEnvironments)
{
<div class="col-sm-1">
@if (topologiesPerSiteEnv.ContainsKey(selectableSiteEnvironment))
{
@Html.CheckBoxFor(m => m.TopologiesEnabled[topologiesPerSiteEnv[selectableSiteEnvironment]])
}
</div>
}
</div>
}
为每个可用的 SiteEnvironment 呈现一个不错的复选框。使用以下 HTML
<div class="form-group">
<label class="control-label col-sm-3">Name:</label>
<div class="col-sm-1">
</div>
<div class="col-sm-1">
</div>
<div class="col-sm-1">
<label class="checkBox-inline">
<input class=" js-notlocked check-Box" id="TopologiesEnabled_2_" name="TopologiesEnabled[2]" type="checkBox" value="true">
<input name="TopologiesEnabled[2]" type="hidden" value="false">
</label>
</div>
</div>
注意:网络表单仅呈现 Id 2 的复选框。
因此,当我提交表单时,POST 请求具有正文:
Id: 1
TopologiesEnabled[2]: true
TopologiesEnabled[2]: false
所以现在我在 ManagedIpviewmodel
构造函数的末尾和我的编辑操作中设置了一个断点:
[HttpPost]
public ActionResult Edit(ManagedIpviewmodel model)
{
/* breakpoint here */
[...code]
我观察到的是,在 POST 请求之后,我的 ManagedIpviewmodel
构造函数被调用,它将字典初始化为 {{1,false}}。但是在我的 Edit
操作的断点处,字典又是空的!
发生了什么?我环顾四周,但我只发现默认的模型绑定器应该能够处理一个简单的
编辑:我确实在输出窗口中看到了一份报告。
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/4/ROOT-1-132574346129045729): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http.resources\v4.0_4.0.0.0_nl_b03f5f7f11d50a3a\System.Net.Http.resources.dll'. Module was built without symbols.
Exception thrown: 'system.invalidOperationException' in System.Net.Http.dll
关于调试的任何提示?
编辑2: 所以我用 .Net(框架)ASP 5 应用程序和 .Net Core 5.0 ASP 应用程序做了一个小测试。我给每个视图模型一个
Dictionary<string,string>
Dictionary<string,int>
Dictionary<string,bool>
Dictionary<int,int>
Dictionary<int,bool>
事实证明,“旧”(框架)ASP(默认)绑定器似乎无法绑定到带有 int
键/索引器的字典,因为最后两个失败了。但是,.NET Core 能够这样做。虽然运气...?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)