Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 输入类型=";“隐藏的”;asp for=不适用于列表_C#_Asp.net Core - Fatal编程技术网

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项的列表。它呈现如下: