在局部视图中绑定没有类型的名称

Bind name without type in partial view

ASP.NET 5 MVC 核心购物车应用程序具有过滤器部分视图

@model LocatorViewModel
@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.OptionTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers

<form asp-antiforgery="false" name='filter' action="@Url.Action("Index", "Home", new { brand = Model.Brand
                  })" method="get">

@Html.DropDownList("Brand", Model.Brands.Select(
            (s) => new SelectListItem() { Text = s.Text, Value = s.Value }))
<input type="submit" value="Search by brand" />    
</form>

模型定义为:

public sealed class LocatorViewModel : ViewModelBase
{
    public string Brand { get; set; }
    public IEnumerable<TextValuePair> Brands { get; set; }

}

public sealed class TextValuePair
{
    public string Text { get; set; }
    public string Value { get; set; }
}

从产品列表视图调用过滤器

    @inherits ViewPageBase<StoreBrowseViewModel>
    @model StoreBrowseViewModel
    @removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.OptionTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
    
   <partial name="Locator" for="LocatorViewModel" />

有模特

public class StoreBrowseViewModel : ViewModelBase
{
    public LocatorViewModel LocatorViewModel;
}

这会呈现带有前缀 LocatorViewModel:select 的元素名称和 ID:

<select id="LocatorViewModel_Brand" name="LocatorViewModel.Brand"><option selected="selected" value="">All</option>
<option value="COLLEGE">College                                                               </option>
<option value="DURABLE">Durable                                                               </option>
</select>

如果提交了带有前缀 LocaforViewModel 的表单,则在浏览器中搜索 url :

Home/Index?LocatorViewModel.Brand=COLLEGE

并且绑定参数未传递给控制器​​:

public class HomeController 
{
    public async Task<IActionResult> Index(string brand) { .. }
}

如何删除不带 LocatoViewModel 前缀的创建 select 元素,以便提交的 url 更短并在 Index 方法中填充品牌参数?

尝试使用类似的东西:

    public async Task<IActionResult> Index([FromQuery(name="LocatorViewModel.Brand")] string brand) { .. }

这不会缩短您的原始参数,但应该可以工作(我还没有测试过)。

或者尝试使用 Jeffrey 别名库,我不知道它是否适用于最新的 MVC 版本,但过去我使用过它:
https://www.nuget.org/packages/ActionParameterAlias/

using ActionParameterAlias;
...
[ParameterAlias("LocatorViewModel.Brand", "Brand", Order = 1)]
public async Task<IActionResult> Index(string brand) { .. }

只需在您的主视图中将 for 更改为 model,如下所示:

<partial name="Locator" model="Model.LocatorViewModel" />

或使用HTML助手:

@await Html.PartialAsync("Locator",Model.LocatorViewModel)