【问题标题】:Get value of disabled drop down in asp.net mvc获取asp.net mvc中禁用下拉的值
【发布时间】:2023-03-14 01:31:01
【问题描述】:

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

随着用户的继续,我正在使用 javascript 动态生成下拉列表。所以没有一个下拉菜单,而是用户想要的。

有人可以告诉我应该如何获取这些值吗?

【问题讨论】:

    标签: html asp.net-mvc post drop-down-menu


    【解决方案1】:

    使用指定的Id创建一个隐藏字段并在禁用下拉列表之前设置它。

    在 MVC 中,

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

    在 JQuery 中,

    function handleDropDownListFooChange(){
        // Get the selected value from drop-down-list before disabling it.
        var selectedFooId = $('#FooId').val();
        $('#FooId').prop("disabled", "disabled");
        $("#hdnFooId").val(selectedFooId);
    
        // Load any data the depends on selected FooId using `selectedFooId` variable.
    }
    

    选中的值会自动绑定到Model.FooId

    【讨论】:

      【解决方案2】:

      在提交之前调用 $('#FooId').removeAttr('disabled')

      【讨论】:

      • 有人能解释为什么这个答案被否决了吗?如果您投反对票,请给出理由。
      • 我认为是因为如果您在缓慢的环境中使用此解决方案,用户会看到下拉菜单已启用。此外,用户现在可以编辑里面的值并重新提交表单。
      【解决方案3】:

      您还可以创建自己的 DropDownListFor 重载,它接受 bool disabled 参数并为您完成繁重的工作,因此您的视图不会被 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);
      }
      

      仅 DropDownListFor 就有 6 个重载,所以它需要大量的猴子编码,但最终得到了回报。

      【讨论】:

        【解决方案4】:

        这是禁用控件的默认行为。我建议您添加一个隐藏字段并在此隐藏字段中设置 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)
        

        【讨论】:

          【解决方案5】:

          一种可能性是创建下拉列表disabled="disabled" 并包含一个具有相同名称和值的隐藏字段,这将允许将此值发送到服务器:

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

          如果您必须使用 javascript 动态禁用下拉菜单,则只需在禁用下拉菜单后将当前选择的下拉菜单值分配给隐藏字段。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-18
            • 1970-01-01
            • 2014-04-02
            • 2021-09-03
            • 1970-01-01
            相关资源
            最近更新 更多