Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3 Html.Editor目标字典未绑定到客户端_Asp.net Mvc 3_Dictionary_Model Binding - Fatal编程技术网

Asp.net mvc 3 MVC3 Html.Editor目标字典未绑定到客户端

Asp.net mvc 3 MVC3 Html.Editor目标字典未绑定到客户端,asp.net-mvc-3,dictionary,model-binding,Asp.net Mvc 3,Dictionary,Model Binding,我的视图模型是按照 EditViewModel SomeUserType User Dictionary<string, string> Claims 主要的区别是对@if ViewData.TemplateInfo.TemplateDepth>4的编辑,这将允许MVC深入到足够深的地方,它可以到达我的字典,然后可以正确绑定所有内容。然而,在调试的进一步询问中,我看到当它绑定Key属性时,它实际上只看到@Html.EditorKey,这是如何工作的 显然,编

我的视图模型是按照

EditViewModel
    SomeUserType User
        Dictionary<string, string> Claims
主要的区别是对@if ViewData.TemplateInfo.TemplateDepth>4的编辑,这将允许MVC深入到足够深的地方,它可以到达我的字典,然后可以正确绑定所有内容。然而,在调试的进一步询问中,我看到当它绑定Key属性时,它实际上只看到@Html.EditorKey,这是如何工作的

显然,编辑器必须对ViewData.ModelMetadata.Properties有一定的了解,但它决定ViewData.TemplateInfo.Visited的结果是,它能够正确放置正确的内容,就在这一点上,我对在foreach循环中发生的事情感到困惑,@Html.editorney可以做任何事情。

试着这样做:

@{
    var i = 0;
    foreach (var key in Model.User.Claims.Keys)
    {
        <div class="editor">
            <input type="hidden" value="@i" name="User.Claims.Index" />
            <div class="editor-label">
                @Html.Label(string.Format("User.Claims[{0}].Key", i))
            </div>
            <div class="editor-field">
                @Html.TextBox(string.Format("User.Claims[{0}].Key", i), key)
            </div>
            <div class="editor-label">
                @Html.Label(string.Format("User.Claims[{0}].Value", i))
            </div>
            <div class="editor-field">
                @Html.TextBox(string.Format("User.Claims[{0}].Value", i), Model.User.Claims[key])
            </div>
        </div>            
        i++;
    }
}
试着这样做:

@{
    var i = 0;
    foreach (var key in Model.User.Claims.Keys)
    {
        <div class="editor">
            <input type="hidden" value="@i" name="User.Claims.Index" />
            <div class="editor-label">
                @Html.Label(string.Format("User.Claims[{0}].Key", i))
            </div>
            <div class="editor-field">
                @Html.TextBox(string.Format("User.Claims[{0}].Key", i), key)
            </div>
            <div class="editor-label">
                @Html.Label(string.Format("User.Claims[{0}].Value", i))
            </div>
            <div class="editor-field">
                @Html.TextBox(string.Format("User.Claims[{0}].Value", i), Model.User.Claims[key])
            </div>
        </div>            
        i++;
    }
}

@Editorstring name将为ViewData中的字段名生成编辑器。如果ViewData不包含对象,则必须使用另一个重载:@Html.Editorstring name,object ViewData


在您的情况下,可以将@Html.Labelstring.FormatUser.Claims[{0}].Key,i替换为@Html.Labelstring.FormatUser.Claims[{0}]。Key,i,User.Claims[i]。Value

@Html.Editorstring name将为ViewData中的字段名生成编辑器。如果ViewData不包含对象,则必须使用另一个重载:@Html.Editorstring name,object ViewData

   @{
 foreach (KeyValuePair<string, string> item  in Model.ShippingCarrier)
 {
    <tr>
    <td>
   @Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" }) : @Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" }) 
    </td>
   </tr>

 }
    }

在您的情况下,可以将@Html.Labelstring.FormatUser.Claims[{0}].Key,i替换为@Html.Labelstring.FormatUser.Claims[{0}]。Key,i,User.Claims[i].Value

这确实有效,但仍然无法解释为什么编辑器语法不起作用,因为我基本上是在模拟MVC中直接发生的情况,当您更改对象编辑器模板以深入了解模型时,对象编辑器模板中的整个代码主要由@Html.Editorprop.PropertyName@Chris组成Marisic,代码不起作用的原因是您没有将任何模型值传递给编辑器模板。您只是简单地使用User.Claims[i]键语法,但默认模型绑定器将该语法用作输入参数,而助手在获取值时不将其用作输出。就我个人而言,我建议您避免在视图模型中使用字典,并将其替换为自定义类型列表。我不明白我在这里的用法与在对象模板的EditorTemplates/Object.ascx部分中看到的固有工作方式有什么不同,这里的对象模板除了属性名之外没有其他功能明智地说,我不确定为什么这个代码会绑定它,但我的代码不会。我看不出这两个词在上下文上有什么不同。此外,我没有看到与自定义列表相关的任何差异,除了大多数自定义列表的属性比Key/Value更多。我收回了没有看到任何上下文差异的声明,我假设通过调试,我会实际看到property.Name计算为索引字符串值,但它只是键,没有任何类型的索引器,非常奇怪。这确实有效,但仍然不能解释为什么编辑器语法不起作用,当我基本上试图模拟MVC中直接发生的情况时,当您更改对象编辑器模板以深入了解模型时,编辑器语法不起作用。对象编辑器模板中的整个代码主要由@Html.Editorprop.PropertyName@Chris组成Marisic,代码不起作用的原因是您没有将任何模型值传递给编辑器模板。您只是简单地使用User.Claims[i]键语法,但默认模型绑定器将该语法用作输入参数,而助手在获取值时不将其用作输出。就我个人而言,我建议您避免在视图模型中使用字典,并将其替换为自定义类型列表。我不明白我在这里的用法与在对象模板的EditorTemplates/Object.ascx部分中看到的固有工作方式有什么不同,这里的对象模板除了属性名之外没有其他功能明智地说,我不确定为什么这个代码会绑定它,但我的代码不会。我看不出这两个词在上下文上有什么不同。此外,我没有看到与自定义列表相关的任何差异,除了大多数自定义列表的属性比Key/Value更多。我收回了没有看到任何上下文差异的声明,我假设通过调试,我将实际看到property.Name对索引字符串值求值,但它只是键,没有任何类型的索引器,非常奇怪。非常有趣,我将在赏金到期前的周一早上首先检查这个!这绝对是正确的,我还没有弄清楚到底要插入到对象中什么additionalViewData yetASP.NET MVC是开源的,你可以查看源代码来了解背景的一切。非常有趣,我将在周一早上赏金到期前第一件事检查这一点!这绝对是对的,我还没有弄清楚到底要插什么
   @{
 foreach (KeyValuePair<string, string> item  in Model.ShippingCarrier)
 {
    <tr>
    <td>
   @Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" }) : @Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" }) 
    </td>
   </tr>

 }
    }

对象additionalViewData yetASP.NET MVC是开源的,您可以查看源代码以了解后台的一切。