Html.DropDownList - 禁用/只读

时间:2009-10-28 09:32:43

标签: asp.net-mvc

使用MVC Html.DropDownList时,我需要设置什么选项才能只读下拉框?

我尝试过像......

Html.DropDownList("Types", Model.Types, new { _Enabled = "false" })

......以及沿着这条线的许多不同的事情;唉,没有快乐!

我认为这会很容易.....而且可能就是这样!

14 个答案:

答案 0 :(得分:126)

试试这个

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

答案 1 :(得分:72)

关于渔获22:

如果我们使用@disabled,则该字段不会发送到该操作(Mamoud) 如果我们使用@readonly,下拉错误仍然允许您更改值

解决方法:使用@disabled,并在下拉列表后添加隐藏的字段:

@Html.HiddenFor(model => model.xxxxxxxx)

然后它被真正禁用,并发送给行动。

答案 2 :(得分:5)

<script type="text/javascript">
$(function () {
        $(document) .ajaxStart(function () {
                $("#dropdownID").attr("disabled", "disabled");
            })
            .ajaxStop(function () {
                $("#dropdownID").removeAttr("disabled");

            });

});
</script>

答案 3 :(得分:3)

或者您可以尝试这样的事情:

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

答案 4 :(得分:3)

我必须禁用下拉列表并隐藏主ID

<div class="form-group">
        @Html.LabelFor(model => model.OBJ_ID, "Objs", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("OBJ_ID", null, htmlAttributes: new { @class = "form-control", @disabled = "disabled"})
            @Html.HiddenFor(m => m.OBJ_ID)
            @Html.ValidationMessageFor(model => model.OBJ_ID, "", new { @class = "text-danger" })
        </div>
    </div>

答案 5 :(得分:2)

把它放在风格

 select[readonly] option, select[readonly] optgroup {
        display: none;
    }

答案 6 :(得分:2)

一些提示可能对某些人而言是显而易见的而不是其他人。

如果您使用的是基于DropDownListFor的HTML帮助程序,那么您的ID将在HiddenFor输入中重复显示。因此,您将拥有在HTML中无效的重复ID,如果您使用javascript填充HiddenForDropDownList,那么您将遇到问题。

解决方案是在htmlattributes数组中手动​​设置ID属性...

@Html.HiddenFor(model => model.Entity)

@Html.EnumDropDownListFor(
  model => model.Entity, 
  new { 
         @class = "form-control sharp", 
         onchange = "", 
         id =` "EntityDD", 
         disabled = "disabled" 
       }
)

答案 7 :(得分:1)

我这样做并称之为

Model.Id > -1 ? Html.EnumDropDownListFor(m => m.Property, new { disabled = "disabled" }) : Html.EnumDropDownListFor(m => m.Property)

答案 8 :(得分:0)

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

作品

答案 9 :(得分:0)

Html.DropDownList(&#34; Types&#34;,Model.Types,new {@disabled =&#34; disabled&#34;}) @ Html.Hidden(Model.Types) 并且要保存和恢复数据,请使用隐藏控件

答案 10 :(得分:0)

为了完整性,这里是DropDownListFor的HTML Helper,当禁用false select时,它会添加启用的参数。它保留了在标记中定义的html属性,或者它允许在标记中使用html属性,它将选择值发布到服务器并且使用非常简洁。

以下是帮助程序的代码:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled)
{
  if (enabled)
  {
    return SelectExtensions.DropDownListFor<TModel, TProperty>(html, expression, selectList, htmlAttributes);
  }

  var htmlAttributesAsDict = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
  htmlAttributesAsDict.Add("disabled", "disabled");
  string selectClientId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression));
  htmlAttributesAsDict.Add("id", selectClientId + "_disabled");

  var hiddenFieldMarkup = html.HiddenFor<TModel, TProperty>(expression);
  var selectMarkup = SelectExtensions.DropDownListFor<TModel, TProperty>(html, expression, selectList, htmlAttributesAsDict);
  return MvcHtmlString.Create(selectMarkup.ToString() + Environment.NewLine + hiddenFieldMarkup.ToString());
}

和用法,目标是禁用select如果选项中只有一个项目,标记:

@Html.DropDownListFor(m => m.SomeValue, Model.SomeList, new { @class = "some-class" }, Model.SomeList > 1)

还有一个更优雅的HTML Helper示例,现在没有帖子支持(相当直接的工作,只需使用HAP并添加隐藏的输入作为根元素兄弟和交换ID&#39; s):

public static MvcHtmlString Disable(this MvcHtmlString previous, bool disabled, bool disableChildren = false)
{
  if (disabled)
  {
    var canBeDisabled = new HashSet<string> { "button", "command", "fieldset", "input", "keygen", "optgroup", "option", "select", "textarea" };
    var doc = new HtmlDocument();
    doc.LoadHtml(previous.ToString());
    var rootElements = doc.DocumentNode.Descendants().Where(
      hn => hn.NodeType == HtmlNodeType.Element && 
      canBeDisabled.Contains(hn.Name.ToLower()) && 
      (disableChildren || hn.ParentNode.NodeType == HtmlNodeType.Document));

    foreach (var element in rootElements)
    {
      element.SetAttributeValue("disabled", "");
    }
    string html = doc.DocumentNode.OuterHtml;
    return MvcHtmlString.Create(html);
  }
  return previous;
}

例如,有一个模型属性bool AllInputsDisabled,当为true时,应禁用所有html输入:

@Html.TextBoxFor(m => m.Address, new { placeholder = "Enter address" }).Disable(Model.AllInputsDisabled)

@Html.DropDownListFor(m => m.DoYou, Model.YesNoList).Disable(Model.AllInputsDisabled)

答案 11 :(得分:0)

尝试使用@disabled和jquery,这样就可以在Controller上获取值。

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

添加一个名为“ disabled”的类,这样您就可以通过搜索该类来启用它(如果存在多个禁用字段),然后在不通过验证属性输入控制器的情况下可以使用“ setTimeout”

<script>

  function clickSubmit() {
    $("select.disabled").attr("disabled", false);
    setTimeout(function () {
        $("select.disabled").attr("disabled", true);
    }, 500);
  }
</script>

这样的提交按钮。

 <button type="submit" value="Submit" onclick="clickSubmit();">Save</button>

在输入的情况下,只需使用@ readonly =“ readonly”

@Html.TextBoxFor("Types",Model.Types, new { @class = "form-control", @readonly= "readonly" })

答案 12 :(得分:-1)

我在提到上述所有评论之后创建了这个答案&amp;答案。 这将解决下拉群体错误,即使它被禁用。

第01步

&#13;
&#13;
Html.DropDownList("Types", Model.Types, new {@readonly="readonly"})
&#13;
&#13;
&#13;

第02步 这是css pointerevent删除代码。

&#13;
&#13;
<style type="text/css">
    #Types {
        pointer-events:none;
    }
</style>
&#13;
&#13;
&#13; 然后你可以得到预期的结果

经测试&amp;证明

答案 13 :(得分:-1)

您可以使用这种方法

禁用除所选选项之外的所有选项:

<select>
    <option disabled>1</option>
    <option disabled>2</option>
    <option selected>3</option>
</select>

通过这种方式,下拉列表仍会提交,但用户无法选择其他值。

使用jQuery

<script>
    $(document).ready(function () {
        $('#yourSelectId option:not(:selected)').prop("disabled", true);
    });
</script>