如何将表单输入绑定到字典值 [英] How to bind form inputs to dictionary values

查看:15
本文介绍了如何将表单输入绑定到字典值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个ASP.NET核心剃刀页面Web应用程序,其中一个页面需要能够修改Dictionary<string, string>属性。

我尝试修改的对象如下:

public class Element
{
    [Key]
    public string ID {get;set;}
    public Dictionary<string, string> Values = new Dictionary<string, string>(); 
}

我可以使用以下代码显示页面上的值:

<form method="POST">
    <ul>
        <li hidden="true">ID: <input asp-for="FocusedItem.ID"/></li>
        @for (int i = 0; i < Model.FocusedItem.Values.Count(); i++)
        {
            <li>@Model.FocusedItem.Values.ElementAt(i).Key: <input asp-for="@Model.FocusedItem.Values.ElementAt(i).Value"/></li>
        }
    </ul>
    <br />
    <input type="submit" value="Submit" />
</form>

页面模型包含以下方法来处理POST事件:

public void OnPost(Element FocusedItem)
{
}
"ID"属性已正确填充,但是"Values"属性的计数为0(表单上的输入值不绑定到Dictionty)。如何解决这个问题?

还有一个额外的问题--如何向词典添加新元素?

编辑:代码- -cshtml:https://raw.githubusercontent.com/thezaza101/RDMUI/master/Pages/Data/ElementManager.cshtml -cs:https://raw.githubusercontent.com/thezaza101/RDMUI/master/Pages/Data/ElementManager.cshtml.cs

推荐答案

@markG是关闭的,但实际的语法应该是:Values[N].KeyValues[N].Value,其中N是您的索引。然而,由于您使用的是标记帮助器来生成字段,所以真正的问题在于您使用ElementAt。模型表达式不能包含任意方法,因为在生成的POST处理中无法绑定到类似ElementAt的内容。相反,您必须使用索引语法,即[i]。然而,在某些情况下,使用词典会出现问题,因为它不能按仅限条目位置的键进行索引。

老实说,我倾向于避免张贴词典,因为它是非结构化数据。在99.99%的情况下,最好将其分解到一个具有属性的类中,而不是一个键字典。如果坚持使用字典,可以尝试将实际键值作为索引器传递:

@foreach (var key in Model.Values.Keys)
{
    <input asp-for="Values[key]" />
}

我还没有亲自尝试过,但我认为它应该会奏效。除此之外,我Know唯一有效的方法是手动生成输入名称:

<input name="Values[@i].Key" value="@Model.Values.ElementAt(i).Key" />
<input name="Values[@i].Value" value="@Model.Values.ElementAt(i).Value" />

这篇关于如何将表单输入绑定到字典值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆