在局部视图中绑定没有类型的名称
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)
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)