24

我有一个 ASP.NET MVC 应用程序。我的页面中有多个下拉列表(HTML SELECT),我必须禁用它们,因为用户继续一一选择它们。当用户将其发布回控制器时,我得到 null 作为函数(操作方法)参数。我搜索并发现 HTML 不会在表单数据中发送禁用字段的值。用 readonly 替换 disabled 属性是行不通的,因为它会使下拉菜单工作。

随着用户的继续,我正在使用 javascript 动态生成下拉列表。所以没有一个下拉菜单,但用户想要多少就多少。

有人可以告诉我应该如何获得这些值吗?

4

5 回答 5

61

一种可能性是制作下拉列表disabled="disabled"并包含一个具有相同名称和值的隐藏字段,这将允许将此值发送到服务器:

@Html.DropDownListFor(x => x.FooId, Model.Foos, new { disabled = "disabled" })
@Html.HiddenFor(x => x.FooId)

如果您必须使用 javascript 动态禁用下拉菜单,则只需在禁用下拉菜单后将当前选择的下拉列表值分配给隐藏字段。

于 2012-07-05T19:53:29.217 回答
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)
于 2012-07-05T19:55:47.470 回答
3

您还可以创建自己的 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 个重载,所以它是很多猴子编码,但它最终得到了回报。

于 2012-11-20T15:51:21.720 回答
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

于 2021-02-22T08:12:00.920 回答
-1

在提交调用之前 $('#FooId').removeAttr('disabled')

于 2014-11-11T16:20:26.067 回答