【问题标题】:ASP.NET MVC disable dropdownlist on page loadASP.NET MVC 在页面加载时禁用下拉列表
【发布时间】:2013-06-08 06:47:50
【问题描述】:

我正在使用 ASP.NET MVC 4 和 jQuery 来实现这一点。

我要做的是根据复选框是否被选中来禁用或启用下拉列表。

我可以让它工作,但是我似乎无法在页面加载时禁用下拉列表。语句被执行,但元素没有被禁用。

我认为问题是,在填充下拉列表(来自视图模型)之前执行检查,并且数据以某种方式覆盖?

这是我的 HTML:

<p>
    @Html.CheckBoxFor(model => model.RoomRequired, new { id= "room-required" })
    <label>Room Required</label>
</p>
<p>
    <label>Room Options</label>
    @Html.DropDownListFor(model => model.OptionId, new SelectList(Model.RoomOptions, "Id", "Name"), "Select option", new { id="option-select })
</p>

并修复了 Javascript:

$(document).ready(function () {    
    $('#room-required').change(function () {
     $('#option-select').prop('disabled', $(this).is(':checked'));
    });

    $('#room-required').trigger('change');
});

【问题讨论】:

  • >> 我认为问题是,在数据(来自视图模型)加载到页面之前执行了检查,并且数据以某种方式覆盖了属性?这不是一个原因,数据从服务器端的视图模型加载,但 javascript 在客户端工作。

标签: jquery asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

.prop() 是更改disabled 属性的首选,您可以将其传递给布尔值,因此您的代码可以简化为:

$('#option-select').prop('disabled', $('#room-required').is(':checked'));

或完整代码:

$(document).ready(function () {    
    $('#room-required').change(function () {
         $('#option-select').prop('disabled', $(this).is(':checked'));
    });

    $('#room-required').trigger('change');
});

Fiddle

【讨论】:

  • 这是一个更清洁的解决方案,谢谢!还嘲笑自己写了另一个 if/else 语句,而我可以触发事件。但不幸的是,这并没有解决问题;页面加载时下拉列表仍处于启用状态。
  • 从小提琴中可以看出,答案中的代码是可以的,这意味着页面上的其他地方一定有什么东西导致了这个问题,也许是某个地方的语法错误。尝试在控制台打开 (F12) 的情况下刷新页面并注意是否有任何错误。
  • 没有错误,但与您的小提琴和我的应用程序的不同之处在于,我的下拉列表是由 razor 使用来自视图模型的数据生成和填充的。
  • 这本身不应该有所作为,因为 razor 将输出一个下拉列表,因此就 jQuery 而言,除了页面上的任何其他元素/代码之外没有任何区别。我建议在浏览器中执行 View>Source,以便获得最终的 HTML,将其保存为 .html doc,然后一点一点地开始删除内容,直到剩下的只是下拉列表和答案中的代码。当您删除位时,每次重新测试页面以查看它是否开始工作。我很感激这可能需要一段时间,但最终会导致您遇到问题。
  • 首先,仔细检查您的下拉菜单和复选框是否具有正确的 ID。如果你有公开的网址,我会看看。
【解决方案2】:

我解决了这个问题。出于某种原因,jQuery 重新启用了下拉列表。我不得不向 HTML 页面本身添加一个 javascript 脚本并在其中触发更改事件。 我知道这不是最好的解决方案,但它是一种适合我的解决方法。

【讨论】:

    【解决方案3】:

    attr() 所做的是将第二个参数中的值分配给 HTML 元素的指定属性。我们想要&lt;input disabled="disabled" /&gt; 而不是&lt;input disabled="true" /&gt;

    所以,使用 -

    $('#option-select').attr('disabled', 'disabled');
    

    而不是-

    $('#option-select').attr('disabled', 'true');
    

    【讨论】:

    • 这并没有什么不同,'true' 和 'disabled' 都可以工作,但是下拉菜单在加载时仍然没有被禁用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多