只读下拉列表,但仍提交它的值

问题描述:

我在ASP.NET MVC中使用Html.DropDownList助手,我想使它成为只读。不幸的是,我也需要它在表单上提交它的价值。只读下拉列表,但仍提交它的值

我发现(通过similar question on SO)使用下面的格式将使下拉为只读,但不会提供对控制器内控件值的访问。

Html.DropDownList("Types", Model.Types, new { @disabled = "disabled" }) 

有谁知道如何使下拉列表只读或禁用ASP.NET MVC,同时也允许它提交一个表单发布?

+0

这真是奇怪的将它张贴:我们一直在使用,你在你的问题包含的代码,它一直蛮好的我们,直到这个星期。我怀疑MVC 3的更新或我们最近添加的客户端验证功能。 – StriplingWarrior 2011-01-24 21:07:12

它是网络浏览器端的预期行为 - 禁用的控件在提交表单时不会将其数据发布到服务器。

您可以通过将一个隐藏字段在页面上与它的价值假的吧 - 只是一定要验证数据。或者在提交操作发生之前使用javascript来启用该字段。

如果你禁用一个领域,但仍表现出了一些值的页面就可以了,那么就必须让你知道该值,而无需从浏览器向服务器发回的方式。

+2

一个很好的答案。 – 2014-04-04 17:41:20

+0

@Prescott很好的答案 – User 2015-03-26 05:52:47

  1. 使它成为一个文本框来代替。
  2. 添加更改事件的JavaScript:

    $('#dropdown').change(function(e) { e.preventDefault(); });

  3. 有1只在其项目的下拉列表。

  4. 有在它的下拉列表的实际值隐藏的项目,因此即使禁用下拉那岂不是被提交。

您可以启用它提交。下行:看起来很奇怪。

$(form).submit(function() { 
    $('#Types').removeAttr('disabled'); 
}); 

或在提交时将值复制到隐藏字段。

$(form).submit(function() { 
    $('#HiddenField').val($('#Types').val()); 
}); 

只是改变该项目的样式表。

visibility:"visible" 
visibility:"hidden" 

欲了解更多信息,请参阅http://support.microsoft.com/kb/199243

你仍然会得到回发,但你也不会再看到它。

我认为最好的办法是通过

$.post(url, 
{ 
    AID: val1, 
    CID: val2 
}, 
    function (data) { 
    // act on model 
    } 
);