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()
)来限制从数据库获取的信息量,则由于所需带宽较少,因此将大大加快查询速度。如果查询仍然没有效率,那么缓存可能是最好的选择。