Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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# 如何保留要发回的字符串集合?_C#_Asp.net_Razor_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 如何保留要发回的字符串集合?

C# 如何保留要发回的字符串集合?,c#,asp.net,razor,asp.net-core,asp.net-core-mvc,C#,Asp.net,Razor,Asp.net Core,Asp.net Core Mvc,我从我的控制器发送一个ViewModel,其中包含一组字符串,用于标记中,如so 控制器: var model = new InviteViewModel { SelectItems = new SelectViewModel { Companies = _companyRepository.GetCompanyNames() } }; Raz

我从我的控制器发送一个
ViewModel
,其中包含一组字符串,用于
标记中,如so

控制器:

        var model = new InviteViewModel
        {
            SelectItems = new SelectViewModel
            {
                Companies = _companyRepository.GetCompanyNames()
            }
        };
Razor视图:

<select class="form-control company_select" asp-for="Company" asp-items="@(new SelectList(Model.SelectItems.Companies))"></select>


这将完美地工作,并将显示下拉框中的所有项目。然而,当我去提交表单时,
公司
对象将为空,当视图被发回时,我得到一个空引用异常。通常我会创建一个隐藏的
标记来保存该值,但是如何使用集合来实现这一点呢?

有很多方法可以做到这一点

似乎您对Razor和html之间的脱节有一个基本的误解。Razor在服务器端执行,其结果只是写入响应流的字符串。一旦写入,razor的作用域就消失了,无法保存数据

一个选项是使用guid作为字典键将集合存储在应用程序缓存或会话缓存中,然后使用隐藏输入作为缓存键。在重新创建视图时,您可以访问服务器并收集集合

这就假设在视图处于活动状态期间,集合没有发生变化,这是因为某些用户习惯可能已经存在很长时间了。如果这是您采取的方法,那么在缓存旧数据时也应该使用某种度量标准

另一种选择是从集合的来源(数据库?)简单地重新生成集合


最后,您提到视图是用空集合返回的,您是从post方法返回视图吗?这是个坏习惯。查找“post redirect get pattern”了解原因和如何避免它。

是的,我一直从数据库中获取这些数据,我不想重新生成集合(集合包含6000多个结果)。至于你的第二个问题,是的,我从post方法返回视图。我现在正在查找模式。6000条记录是一个不错的数量,但根据所拍摄的内容重新查询并不可怕。如果您使用投影(
.Select()
)来限制从数据库获取的信息量,则由于所需带宽较少,因此将大大加快查询速度。如果查询仍然没有效率,那么缓存可能是最好的选择。