我正试图在列表中获取所选项目的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">
我在其中添加了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; }
}
有什么想法我做错了吗?
答案 0 :(得分:1)
让我们回顾一下您在服务器上的操作方法:
public async Task<IActionResult> Create([Bind("StatusId,CNPJ,Name,BusinessName,State,City,Street,District,CEP,Observation,Phone,Cellphone,Email,Status")] Company company)
{}
“公司模型”在这里需要StatusId
,Status
等字段。
但是,服务器端的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">