【问题标题】:How can I hold a collection of strings to post back?如何保存要回发的字符串集合?
【发布时间】:2016-12-17 10:54:33
【问题描述】:

我从我的控制器发送一个ViewModel,其中包含要在<select> 标记中使用的字符串集合,就像这样......

控制器:

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

剃刀视图:

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

这很完美,并且会在下拉框中显示所有项目。但是,当我提交表单时,Companies 对象将为空,当视图被发回时,我得到一个空引用异常。通常我会创建一个隐藏的&lt;input&gt; 标记来保存该值,但是如何使用集合来做到这一点?

【问题讨论】:

    标签: c# asp.net razor asp.net-core asp.net-core-mvc


    【解决方案1】:

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

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

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

    这假设在视图处于活动状态期间集合没有更改,考虑到某些用户习惯,这可能会持续很长时间。缓存时还应该使用某种指标来使旧数据失效,如果这是您采取的路线。

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

    最后,您提到视图是与空集合一起返回的,您是从 post 方法返回视图吗?那是不好的做法。查找“post-redirect-get 模式”以了解为什么以及如何避免它。

    【讨论】:

    • 是的,我一直从数据库中获取这些数据,我不想重新生成集合(集合包含超过 6000 个结果)。至于您的第二个问题,是的,我正在从 post 方法返回视图。我现在正在查找模式。
    • 6000 条记录是一个可观的数量,但根据所采用的内容重新查询并不可怕。如果您使用投影 (.Select()) 来限制从数据库中获取的信息量,它将大大加快您的查询速度,因为需要的带宽更少。如果查询仍然没有效率,那么缓存可能是您最好的选择。
    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2011-10-08
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多