2012-07-05 102 views
19

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

我正在用户继续动态使用JavaScript生成下拉列表。所以没有一个下拉菜单,但用户需要的数量是多少。

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

回答

40

一种可能性是使下拉列表disabled="disabled",包括具有相同的名称和价值,这将使该值发送到服务器的隐藏字段:

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

如果必须禁用动态下拉使用javascript,只需在禁用它之后将当前选定的下拉列表的值分配给隐藏字段即可。

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) 
0

您还可以创建它接受一个bool disabled参数和做繁重的你自己DropDownListFor超负荷所以你的观点是不是堆满了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); 
} 

有6个重载单独DropDownListFor所以这是一个很大的monkeycoding,但它到底恕我直言不负有心人。

-2

提交之前致电$('#FooId')。removeAttr('disabled')