C# 输入类型=";“隐藏的”;asp for=不适用于列表
我正在寻找一种聪明的方法,将列表的值存储在表单的C# 输入类型=";“隐藏的”;asp for=不适用于列表,c#,asp.net-core,C#,Asp.net Core,我正在寻找一种聪明的方法,将列表的值存储在表单的隐藏输入中,并在发布表单时将值返回到我的viewmodel中 在我的viewmodel中,我有一个带有SelectListItem项的列表。该列表用作select元素中的asp项。现在,当用户关闭scrips并发布有错误的表单时,我希望在不必重新创建列表的情况下重新显示表单 属性看起来像: 公共IReadOnlyCollection用户级别{get;set;} 在razor视图中,这将无法正确保存UserLevel的值: 我找到了,但是我没有
隐藏输入中,并在发布表单时将值返回到我的viewmodel中
在我的viewmodel中,我有一个带有SelectListItem
项的列表。该列表用作select
元素中的asp项。现在,当用户关闭scrips并发布有错误的表单时,我希望在不必重新创建列表的情况下重新显示表单
属性看起来像:
公共IReadOnlyCollection用户级别{get;set;}
在razor视图中,这将无法正确保存UserLevel的值:
我找到了,但是我没有找到一个好的解决方案。有人知道一种聪明的方法来计算列表中的值吗?你可以尝试按照链接到的答案中的建议来做
不要隐藏所有这些,而是逐个元素隐藏
会是这样的
@for(int i = 0; i < UserLevels.Count; i++)
{
<input type="hidden" asp-for="UserLevels[i]"/>
}
@for(int i=0;i
您可以尝试按照链接到的答案中的建议进行操作
不要隐藏所有这些,而是逐个元素隐藏
会是这样的
@for(int i = 0; i < UserLevels.Count; i++)
{
<input type="hidden" asp-for="UserLevels[i]"/>
}
@for(int i=0;i
经过一些搜索和实验,我找到了一个很好的解决方案
我创建了两个扩展方法SerializeForHidden
和DeserializeForHidden
(见下文),并在视图模型中添加了一个额外的属性:
公共字符串UserLevelsHidden
{
get=>UserLevels.SerializeForHidden();
set=>UserLevels=value.DeserializeForHidden(UserLevels);
}
现在,UserLevels
的值保存在表单中,并在post中使用以下内容重新创建:
这将适用于任何可序列化类型,而不仅仅适用于列表
扩展方法:
使用Newtonsoft.Json;
使用System.Web;
名称空间Forestbrook.Web
{
公共静态类WebHelper
{
///
///反序列化已序列化的隐藏HTML表单字段中的值
///将其隐藏为其原始类型。
///
///要反序列化到的类型
///HTML表单中的序列化和HtmlEncoded字符串
///仅用于简化T检测的目标属性。可能为空。
///值为null或空时反序列化的对象或null
公共静态T反序列化ForHidden(此字符串值,T 41;
{
if(string.IsNullOrEmpty(value))
返回默认值;
返回JsonConvert.DeserializeObject(HttpUtility.HtmlCode(值));
}
///
///序列化要存储在隐藏HTML表单字段中的复杂值(如列表)
///
///要序列化的值
///Json序列化和HtmlEncoded字符串
公共静态字符串序列化ForHidden(此对象值)
{
如果(值==null)
返回null;
返回HttpUtility.HtmlEncode(JsonConvert.SerializeObject)(值,
新的JsonSerializerSettings{DefaultValueHandling=DefaultValueHandling.Ignore});
}
}
}
请注意,DeserializeForHidden中的T
参数的添加只是为了更方便地使用DeserializeForHidden。如果愿意,您可以删除它,但是您必须始终指定类型。经过一些搜索和实验,我找到了一个很好的解决方案
我创建了两个扩展方法SerializeForHidden
和DeserializeForHidden
(见下文),并在视图模型中添加了一个额外的属性:
公共字符串UserLevelsHidden
{
get=>UserLevels.SerializeForHidden();
set=>UserLevels=value.DeserializeForHidden(UserLevels);
}
现在,UserLevels
的值保存在表单中,并在post中使用以下内容重新创建:
这将适用于任何可序列化类型,而不仅仅适用于列表
扩展方法:
使用Newtonsoft.Json;
使用System.Web;
名称空间Forestbrook.Web
{
公共静态类WebHelper
{
///
///反序列化已序列化的隐藏HTML表单字段中的值
///将其隐藏为其原始类型。
///
///要反序列化到的类型
///HTML表单中的序列化和HtmlEncoded字符串
///仅用于简化T检测的目标属性。可能为空。
///值为null或空时反序列化的对象或null
公共静态T反序列化ForHidden(此字符串值,T 41;
{
if(string.IsNullOrEmpty(value))
返回默认值;
返回JsonConvert.DeserializeObject(HttpUtility.HtmlCode(值));
}
///
///序列化要存储在隐藏HTML表单字段中的复杂值(如列表)
///
///要序列化的值
///Json序列化和HtmlEncoded字符串
公共静态字符串序列化ForHidden(此对象值)
{
如果(值==null)
返回null;
返回HttpUtility.HtmlEncode(JsonConvert.SerializeObject)(值,
新的JsonSerializerSettings{DefaultValueHandling=DefaultValueHandling.Ignore});
}
}
}
请注意,DeserializeForHidden中的T
参数的添加只是为了更方便地使用DeserializeForHidden。如果愿意,可以将其删除,但必须始终指定类型。只需通过模型添加值属性add assign即可。
请尝试以下代码:
<input type="hidden" asp-for="UserLevels" value="@Model.UserLevels" />
只需通过模型添加并分配属性值。
请尝试以下代码:
<input type="hidden" asp-for="UserLevels" value="@Model.UserLevels" />
这适用于字符串列表,但不适用于包含SelectListItem项的列表。它的呈现方式如下:这适用于字符串列表,但不适用于包含SelectListItem项的列表。它呈现如下: