如何将表单输入绑定到字典值
How to bind form inputs to dictionary values
我正在创建一个 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(表单上的输入值未绑定到听写)。如何解决?
还有一个额外的问题 - 如何向字典中添加一个新元素?
编辑:代码 -
-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].Key
和 Values[N].Value
,其中 N
是您的索引。但是,由于您使用标签助手来生成字段,真正的问题是您使用 ElementAt
。模型表达式不能包含任意方法,因为无法在结果 POST 处理中绑定到 ElementAt
之类的东西。相反,您必须使用索引语法,即 [i]
。然而,使用字典的地方有问题,因为它不能按项目位置索引 - 只有键。
老实说,我倾向于避免发布字典,因为它是非结构化数据。在 99.99% 的情况下,将其分解为具有属性的 class 而不是键字典可能会更好。如果你坚持使用字典,你可以尝试传递实际的键值作为索引:
@foreach (var key in Model.Values.Keys)
{
<input asp-for="Values[key]" />
}
我个人没有尝试过,但我认为它应该可行。除此之外,我知道的唯一方法是手动生成输入名称:
<input name="Values[@i].Key" value="@Model.Values.ElementAt(i).Key" />
<input name="Values[@i].Value" value="@Model.Values.ElementAt(i).Value" />
我正在创建一个 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(表单上的输入值未绑定到听写)。如何解决?
还有一个额外的问题 - 如何向字典中添加一个新元素?
编辑:代码 - -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].Key
和 Values[N].Value
,其中 N
是您的索引。但是,由于您使用标签助手来生成字段,真正的问题是您使用 ElementAt
。模型表达式不能包含任意方法,因为无法在结果 POST 处理中绑定到 ElementAt
之类的东西。相反,您必须使用索引语法,即 [i]
。然而,使用字典的地方有问题,因为它不能按项目位置索引 - 只有键。
老实说,我倾向于避免发布字典,因为它是非结构化数据。在 99.99% 的情况下,将其分解为具有属性的 class 而不是键字典可能会更好。如果你坚持使用字典,你可以尝试传递实际的键值作为索引:
@foreach (var key in Model.Values.Keys)
{
<input asp-for="Values[key]" />
}
我个人没有尝试过,但我认为它应该可行。除此之外,我知道的唯一方法是手动生成输入名称:
<input name="Values[@i].Key" value="@Model.Values.ElementAt(i).Key" />
<input name="Values[@i].Value" value="@Model.Values.ElementAt(i).Value" />