gpt4 book ai didi

c# - 输入类型 ="hidden"asp-for= 不适用于 List

转载 作者:行者123 更新时间:2023-12-05 00:58:09 34 4
gpt4 key购买 nike

我正在寻找一种智能方法来将列表的值存储在表单中的隐藏输入中,并在表单发布时将值返回到我的 View 模型中。

在我的 View 模型中,我有一个包含 SelectListItem 项的列表。该列表用作 select 元素中的 asp-items。现在,当用户关闭脚本并发布有错误的表单时,我想重新显示表单而无需重新创建列表。

属性如下:

public IReadOnlyCollection<SelectListItem> UserLevels { get; set; }

在 razor View 中,这不会正确保存 UserLevels 的值:

<input type="hidden" asp-for="UserLevels"/>

我找到了 this question about a similar problem ,但我没有找到一个好的解决方案。有谁知道一种巧妙的方法来破坏列表的值?

最佳答案

经过一番搜索和试验,我找到了一个不错的解决方案。

我创建了两个扩展方法 SerializeForHiddenDeserializeForHidden(见下文)并在 View 模型中添加了一个额外的属性:

public string UserLevelsHidden
{
get => UserLevels.SerializeForHidden();
set => UserLevels = value.DeserializeForHidden(UserLevels);
}

现在 UserLevels 的值保存在表单中,并在帖子中重新创建:

<input type="hidden" asp-for="UserLevelsHidden"/>

这适用于任何可序列化类型,而不仅仅是列表。

扩展方法:

using Newtonsoft.Json;
using System.Web;

namespace Forestbrook.Web
{
public static class WebHelper
{
/// <summary>
/// Deserialize a value from a hidden HTML Form field which was serialized
/// with SerializeForHidden to its original type.
/// </summary>
/// <typeparam name="T">Type to deserialize to</typeparam>
/// <param name="value">serialized and HtmlEncoded string from HTML form</param>
/// <param name="_">Target property only used to simplify detection of T. May be null.</param>
/// <returns>Deserialized object or null when value was null or empty</returns>
public static T DeserializeForHidden<T>(this string value, T _)
{
if (string.IsNullOrEmpty(value))
return default;

return JsonConvert.DeserializeObject<T>(HttpUtility.HtmlDecode(value));
}

/// <summary>
/// Serialize a complex value (like a List) to be stored in a hidden HTML Form field
/// </summary>
/// <param name="value">Value to serialize</param>
/// <returns>Json serialized and HtmlEncoded string</returns>
public static string SerializeForHidden(this object value)
{
if (value == null)
return null;

return HttpUtility.HtmlEncode(JsonConvert.SerializeObject(value,
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }));
}
}
}

请注意,添加 DeserializeForHidden 中的 T _ 参数只是为了使 DeserializeForHidden 的使用更容易。如果你愿意,你可以删除它,但你总是必须指定类型。

关于c# - 输入类型 ="hidden"asp-for= 不适用于 List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58627155/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com