我知道也有类似的问题。我已经阅读了几乎所有内容(除非有人可以证明否则)。
我正在编写一个帮助台应用程序作为练习项目,以提高我的编程技能。
我有一个Create动作,它创建了一个“ Ticket”,我希望将该“ Ticket”的“ State”设置为“ New”。我希望将其禁用的原因是,只有具有管理员角色的用户才能更新状态(进行中,保留,已解决,已关闭等)。
这是我到目前为止尝试过的:
<div class="form-group">
@Html.LabelFor(model => model.State, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@if (User.IsInRole("Admin"))
{
@Html.DropDownListFor(m => m.State, Model.States, htmlAttributes: new { @class = "form-control" })
}
else
{
@Html.DropDownListFor(m => m.State, Model.States, new { @class = "form-control", @disabled = "disabled", @id = "FakeStates" })
@Html.HiddenFor(m => m.State, Model.States)
}
@Html.ValidationMessageFor(model => model.State, "", new { @class = "text-danger" })
</div>
</div>
问题: 该值不会传递给控制器,并且最终db列为null。
我可能忽略了一些简单的事情,如果可以的话,请看一看并指出吗?
谢谢。
答案 0 :(得分:3)
您需要重新排列元素的顺序,并将HiddenFor放在DropDownListFor上方。
这是因为提交表单时,将返回与模型匹配的ID的第一个输入。
发布到控制器时,不返回禁用的输入也没有任何意义。因此,我认为这是在隐藏之前找到了您已禁用的下拉菜单,因此正在提交空值。
我注意到您已尝试向DropDownListFor添加其他ID,但是我不确定在正确的模型绑定方面这是如何工作的。
另一种选择是显示标签,而不是禁用的下拉菜单。
答案 1 :(得分:0)
尝试一下:
@Html.HiddenFor(m => m.State, new { Value = Model.States })
ps:Model.States中有值吗?