微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有简单字典的 ASP.Net 5 ViewModel 未正确更新

如何解决带有简单字典的 ASP.Net 5 ViewModel 未正确更新

我在 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 举报,一经查实,本站将立刻删除。