【问题标题】:Querystring generated with asp-for doesn't match that generated from Url.Action on same model使用 asp-for 生成的查询字符串与同一模型上从 Url.Action 生成的查询字符串不匹配
【发布时间】:2019-11-26 23:25:37
【问题描述】:

目前正在重新开发网站的一部分,我正在努力让一些新的 asp.net 功能与旧代码保持一致。

特别是其中一种形式已更改为使用 asp-for 属性:

<div class="form-group label-floating col-lg-6 col-xs-12">
    <input asp-for="@this.Model.SearchFilters.Surname" class="form-control" placeholder="@(page.Labels["Surname"].Content.Term)" aria-label="@(page.Labels["Surname"].Content.Term)" />
</div>
<div class="form-group label-floating col-lg-6 col-xs-12">
    <input asp-for="@this.Model.SearchFilters.Firstname" class="form-control" placeholder="@(page.Labels["Forenames"].Content.Term)" aria-label="@(page.Labels["Forenames"].Content.Term)" />
</div>

这会生成一个查询字符串,如下所示:

?SearchFilters.Surname=bob&SearchFilters.Firstname=tway

在接下来的控制器操作中,使用Url.Action: 生成返回此页面的路径

Url.Action(
    nameof(this.MyMethod),
    new { viewModel.SearchFilters.Firstname, viewModel.SearchFilters.Surname });

但这会生成一个没有 SearchFilters 前缀的查询字符串:

?Surname=bob&Firstname=tway

由于与预期模型不匹配,生成的 Url 会导致服务器错误。

我尝试更改 Url.Action 以指定名称,如下所示:

Url.Action(
    nameof(this.MyMethod),
    new { SearchFilters.Firstname = viewModel.SearchFilters.Firstname, SearchFilters.Surname = viewModel.SearchFilters.Surname });

但这不会编译,说它是“无效的匿名类型成员声明器”。

在理想情况下,我想更改 Url.Action 以包含前缀,但我无法弄清楚这是如何完成的。我会满足于删除 asp-for 生成的前缀,因为如果需要我会更改模型。无论哪种方式,我如何使这两个查询字符串对齐?

【问题讨论】:

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


    【解决方案1】:

    您可以使用RouteValueDictionary 代替匿名对象来指定带句点的参数名称。

    Url.Action(
        nameof(this.MyMethod),
        new new RouteValueDictionary { { "SearchFilters.Firstname", viewModel.SearchFilters.Firstname }, { "SearchFilters.Surname", viewModel.SearchFilters.Surname } });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2015-07-11
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多