【问题标题】:How to bind form inputs to dictionary values如何将表单输入绑定到字典值
【发布时间】:2018-11-30 04:56:28
【问题描述】:

我正在创建一个 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>

页面模型包含以下处理发布事件的方法:

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

【问题讨论】:

  • 您的视图强类型化到什么?您如何以及在何处填充 Values 属性?
  • @shyju 我的观点强烈输入是什么意思?此应用程序是 REST 服务的 UI,我的 PageModel 中有一个 Element 类型的“FocusedItem”属性,该属性由服务器在 OnGet() 方法中填充。
  • 尝试使用一对字段,例如&lt;input name="Values[0][key]"&gt; & &lt;input name="Values[0][value]"&gt;
  • @MarkG 不幸的是,这种方法不走运。

标签: c# asp.net-core razor-pages


【解决方案1】:

@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]" />
}

我没有亲自尝试过,但我认为它应该可以工作。除此之外,我知道的唯一方法是手动生成输入名称:

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

【讨论】:

  • 谢谢!我不得不对我的 PageModel 进行一些更改,但是您的第一个建议有效。如果它是 PageModel 的属性,它似乎将绑定到“Dictionary Values”,但它不会绑定到子属性(FocusedItem.Values)。另外我需要使用 ElementAt() 的原因是因为字典的键是一个字符串 - Values[@i] 给了我一个错误。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2013-02-12
  • 2020-03-19
  • 2019-12-11
  • 2012-04-07
  • 2019-03-10
相关资源
最近更新 更多