禁用的属性不适用于ListBoxFor和DropDownListFor

时间:2016-05-20 14:11:23

标签: asp.net-mvc razor html.dropdownlistfor html.listboxfor

我有一个网页,通过像这样的RenderPartial Html Helper渲染组件来动态创建组件

Html.RenderPartial("_UploadStaticField", config);

在配置对象中有一个名为“isUnderReview”的字段。当此设置为true时,应使用下面的代码禁用组件

//Single selection
<div class="editor-section">
    <div class="label">
        @Html.DisplayEditLabel(Model.Label, Model.Required.Value)
    </div>
    <div class="field large-text-field">
        @Html.DropDownListFor(m => m.SelectedListOptionID, new SelectList(Model.ListOptions, "ID", "Name", Model.SelectedListOptionID).OrderBy(l => l.Value), new Dictionary<string, object>{
                    {"id", "staticField_" + Model.ID}})
    </div>
</div>

<script>
    $(document).ready(function () {
        if ("@Model.IsUnderReview" == "True") {
        document.getElementById("staticField_" + "@Model.ID").disabled = true;
        }
    });
</script>

和..

//Multiple selection
<div class="editor-section">
    <div class="label">
        @Html.DisplayEditLabel(Model.Label, Model.Required.Value)
    </div>
    <div class="field large-text-field">
        @Html.ListBoxFor(x => x.SelectedRoles, filetypes, new { @class = "multiselectFileTypes" , id = "staticFieldM_" + Model.ID})
    </div>
</div>

@Scripts.Render(BundleConfig.Scripts_MultiSelect)
<script>
    $(document).ready(function () {
        if ("@Model.IsUnderReview" == "True") {
            document.getElementById("staticFieldM_" + "@Model.ID").disabled = true;
        }
    });
</script>

代码可以运行方法,但仍然可以使用组件。有没有办法取消任何用户选择,这些选择将作为禁用值,因为值不会改变?

1 个答案:

答案 0 :(得分:0)

脚本永远不应该是部分的(您可能会生成多个可能导致其他问题的内联脚本,特别是对于捆绑包)。但是,对于此,甚至不需要脚本,您可以使用简单的if语句或条件属性来生成所需的内容。

当您说&#34;但仍然可以使用组件&#34; 时,我猜测您使用插件生成控件,如{{1这将隐藏原始Scripts.Render(BundleConfig.Scripts_MultiSelect)元素并生成自己的html,这就是为什么它仍然是交互式的。

但是下一个问题是禁用的控件不会回发值,因此<select>SelectedListOptionID的值将是默认值,可能导致您的应用失败,具体取决于您的代码POST方法。

SelectedRoles移动到您的视图或布局中,删除脚本以禁用该元素,然后将部分更改为

@Scripts.Render()

附注:

  1. 没有理由添加自己的@if(Model.IsUnderReview) { @Html.HiddenFor(m => m.SelectedListOptionID) // if you want the value to be posted // add an element to display the Name associated with the SelectedListOptionID // if necessary, for example your view model might include a property // string SelectedListOptionName } else { @Html.DropDownListFor(m => m.SelectedListOptionID, new SelectList(Model.ListOptions, "ID", "Name").OrderBy(l => l.Value)) } 属性( id方法会生成DropDownListFor()
  2. 删除<select id="SelectedListOptionID" ... >构造函数的最后一个参数 (SelectList) - 它被忽略了 Model.SelectedListOptionID方法。我还建议您的模型包含DropDownListFor()属性,并在控制器中填充该属性,以便它可以只是IEnumerable<SelectListItem> OptionsList