使用.NET Core的Material Design Lite中的Asp-for标记助手

问题描述 投票:1回答:1

我正在尝试获取列表中所选项目的StatusId

我有一个使用Material Design Lite创建的状态列表:

<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label getmdl-select getmdl-select__fix-height">
    <input type="text" value="" class="mdl-textfield__input" id="statusList" asp-for="Status" readonly>
    <input type="hidden" value="" name="statusList" asp-for="StatusId">
    <i class="mdl-icon-toggle__label material-icons">keyboard_arrow_down</i>
    <label for="statusList" class="mdl-textfield__label">Status</label>
    <ul for="statusList" class="mdl-menu mdl-menu--bottom-left mdl-js-menu">
        @foreach (var status in ViewBag.Status)
        {
            <li class="mdl-menu__item" data-val="@status.Id">@status.Name</li>
        }
    </ul>
</div>

我在这里设置了StatusId

<li class="mdl-menu__item" data-val="@status.Id">@status.Name</li>

我注意到当我在列表中选择一个项目时,StatusId会转到此input

<input type="hidden" value="" name="statusList" asp-for="StatusId">

enter image description here

我在其中添加了asp-for,但它无法正常工作。在Controller之后submit的值是零。

以下输入中的asp-for="Status"完成并且与Controller的绑定完美地发生:

<input type="text" value="" class="mdl-textfield__input" id="statusList" asp-for="Status" readonly>

Controller方法:

public async Task<IActionResult> Create([Bind("StatusId,CNPJ,Name,BusinessName,State,City,Street,District,CEP,Observation,Phone,Cellphone,Email,Status")] Company company)
{}

CompanyStatus型号:

public class CompanyStatus
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Company型号:

public class Company
{
    public int Id { get; set; }
    public int StatusId { get; set; }
    public string CNPJ { get; set; }
    public string Name { get; set; }
    public string BusinessName { get; set; }
    public string State { get; set; }
    public string City { get; set; }
    public string Street { get; set; }
    public string District { get; set; }
    public string CEP { get; set; }
    public string Observation { get; set; }
    public string Phone { get; set; }
    public string Cellphone { get; set; }
    public string Email { get; set; }
    public string Status { get; set; }
}

我有什么想法我做错了吗?

c# asp.net-core material-design
1个回答
1
投票

让我们回顾一下您在服务器上的操作方法:

public async Task<IActionResult> Create([Bind("StatusId,CNPJ,Name,BusinessName,State,City,Street,District,CEP,Observation,Phone,Cellphone,Email,Status")] Company company)
{}

在这里,公司模型需要StatusIdStatus等字段。

但是,服务器端的input TagHelper

<input type="text" value="" class="mdl-textfield__input" id="statusList" asp-for="Status" readonly>
<input type="hidden" value="" name="statusList" asp-for="StatusId">

在浏览器中将被渲染为html标签,如下所示:

<input type="text" value="" class="mdl-textfield__input" id="statusList" readonly="" name="Status">
<input type="hidden" value="" name="statusList" data-val="true" data-val-required="The StatusId field is required." id="StatusId">

请注意,在浏览器中渲染时,隐藏的name元素的<input>属性是statusList而不是statusId

原因是服务器端的name TagHelper的input属性会覆盖name属性生成的asp-for属性。

因此,您发送到服务器的有效负载将是:

Status=your-status-name&statusList=1&__RequestVerificationToken=xxx

由于服务器不关心statusList字段,它将简单地忽略它。

当用户选择input#statusId时,我不确定您的Material Design Lite和客户端脚本如何将值绑定到<ul>/<li>。但是,如果您想通过表单发送请求,则应该从以下位置更改您的视图代码:

<input type="hidden" value="" name="statusList" asp-for="StatusId">

成为 :

<input type="hidden" value="" asp-for="StatusId">
© www.soinside.com 2019 - 2024. All rights reserved.