我有一个ASP.NET MVC应用程序。我在我的页面中有多个下拉列表(HTML SELECT),我必须禁用它们,因为用户继续逐个选择它们。当用户将其发回控制器时,我将获取null作为函数(操作方法)参数。我搜索并发现HTML不会在表单数据中发送禁用字段的值。用readonly替换disabled属性不会起作用,因为它会渲染下拉列表。
我在用户继续使用javascript动态生成下拉列表。所以没有一个下拉列表,但只有用户想要的下拉列表。
有人可以告诉我应该如何获得价值观?
答案 0 :(得分:49)
一种可能性是制作下拉列表disabled="disabled"
并包含一个具有相同名称和值的隐藏字段,以便将此值发送到服务器:
@Html.DropDownListFor(x => x.FooId, Model.Foos, new { disabled = "disabled" })
@Html.HiddenFor(x => x.FooId)
如果您必须使用javascript动态禁用下拉列表,则只需在禁用后立即将当前选定的下拉列表值分配给隐藏字段。
答案 1 :(得分:3)
这是禁用控件的默认行为。我建议你添加一个隐藏字段,并在这个隐藏字段中设置DropDownList的值,并使用它。
类似的东西:
//just to create a interface for the user
@Html.DropDownList("categoryDump", (SeectList)ViewBag.Categories, new { disabled = "disabled" });
// it will be send to the post action
@Html.HiddenFor(x => x.CategoryID)
答案 2 :(得分:2)
您还可以创建自己的DropDownListFor重载,它接受bool disabled
参数并为您完成繁重的工作,以便您的视图不会被if disablethisfield then ...
混乱。
这些行中的某些东西可以做到:
public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool disabled)
{
if (disabled)
return MvcHtmlString.Create(htmlHelper.HiddenFor(expression).ToString() + htmlHelper.DropDownListFor(expression, selectList, new { disabled="disabled" }).ToString());
else
return htmlHelper.DropDownListFor(expression, selectList);
}
单独使用DropDownListFor有6次重载,因此它会进行大量的编码,但最终还是会有所收获。
答案 3 :(得分:0)
使用指定的 Id 创建一个隐藏字段并在禁用下拉列表之前设置它。
<块引用>在MVC中,
@Html.DropDownListFor(x => x.FooId, Model.Foos)
@Html.HiddenFor(x => x.FooId, new { @id = "hdnFooId" })
<块引用>
在 JQuery 中,
function handleDropDownListFooChange(){
// Get the selected value from drop-down-list before disabling it.
var selectedFooId = $('#FooId').val();
$('#FooId').prop("disabled", "disabled");
$("#hdnFooId").val(selectedFooId);
// Load any data the depends on selected FooId using `selectedFooId` variable.
}
所选值将自动绑定到 Model.FooId
。
答案 4 :(得分:-2)
在提交电话$('#FooId')之前.removeAttr('disabled')