获取asp.net mvc中的禁用值

时间:2012-07-05 19:50:21

标签: html asp.net-mvc post drop-down-menu

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

我在用户继续使用javascript动态生成下拉列表。所以没有一个下拉列表,但只有用户想要的下拉列表。

有人可以告诉我应该如何获得价值观?

5 个答案:

答案 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')