29

我有一个 C# .Net 网络应用程序。在该应用程序中,我需要根据谁登录到系统有条件地禁用Html.TextBoxFor控件(也是控件)。Html.DropDownListFor我尝试使用

 @Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled })

在 Controller 中将Where@ViewBag.IsDisabled设置为String.Empty“已禁用”。但是,这呈现为IsDisabled='disabled'左右IsDisabled=""控件未被禁用。当我尝试

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.Disabled })

即使不ViewBag.Disabled包含任何文本,该控件也始终被禁用。如何有条件地禁用Html.TextBoxFor()控件?

4

6 回答 6

58

尝试

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {})
于 2012-01-31T20:07:31.357 回答
20

@epignosisx 发布的解决方案有效,但如果您想添加一些其他属性,这可能是个问题,因为您必须将它添加到两个对象(一个有disabled,一个现在是空的)。

更糟糕的是,如果您有其他一些 bool 属性,因为您将有四个不同的对象,每个对象用于每种组合。

这里最好的解决方案(使用更多代码)是为 HtmlHelper 构建一个扩展方法,以接收您的布尔属性作为参数。

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, object htmlAttributes = null)
{
    return TextBoxDisabledFor(htmlHelper, expression, disabled, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, IDictionary<string, object> htmlAttributes)
{
    if (htmlAttributes == null)
        htmlAttributes = new Dictionary<string, object>();
    if (disabled)
        htmlAttributes["disabled"] = "disabled";
    return htmlHelper.TextBoxFor(expression, htmlAttributes);
}

这里还有另一个例子

于 2013-11-01T12:04:43.097 回答
11

我遇到了同样的问题,并决定编写自己的HtmlHelper扩展方法。

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled)
    {
        if (helper == null)
            throw new ArgumentNullException();

        if (disabled)
        {
            string html = helper.ToString();
            int startIndex = html.IndexOf('>');

            html = html.Insert(startIndex, " disabled=\"disabled\"");
            return MvcHtmlString.Create(html);
        }

        return helper;
    }

这将接受一个布尔值来指示控件是否应该被禁用。它只是附加在字符串中遇到disabled="disabled"的第一个内部。>

你可以像下面这样使用它。

@Html.TextBoxFor(model => model.ProposalName).Disable(true)

于 2015-09-21T11:20:25.257 回答
11

这是我使用的方法,它不需要扩展,并且不会将您限制为只有一个 HTML 属性。它假定您的模型中有一个名为“已禁用”的布尔属性,但您可以在其中放置您想要的任何内容,只要它对三元运算符的计算结果为布尔值:

@Html.TextBoxFor(model => model.Whatever,
  new Dictionary<string, object>() {
    { "size", "5" },
    { "class", "someclasshere" },
    { model.Disabled ? "disabled" : "data-notdisabled", "disabled" }
  })

标准快捷表示法的限制是属性的名称不能是动态的。通过创建正确类型的字典,您可以使属性名称动态化,然后将该字典作为属性字典传递给文本框。当该字段不被禁用时,它会传递一个名为“data-notdisabled”的属性,而不是一个名为“disabled”的属性,然后浏览器将忽略该属性。

于 2016-09-20T19:50:02.410 回答
7

扩展@James 的答案,我编写了这个 HtmlHelper 扩展,disabled如果属性已经存在则更新/删除它,如果不存在则添加它:

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) {
    string html = helper.ToString();
    var regex = new Regex("(disabled(?:=\".*\")?)");
    if (regex.IsMatch(html)) {
        html = regex.Replace(html, disabled ? "disabled=\"disabled\"" : "", 1);
    } else {
        regex = new Regex(@"(\/?>)");
        html = regex.Replace(html, disabled ? "disabled=\"disabled\"$1" : "$1", 1);
    }
    return MvcHtmlString.Create(html);
}

它还可以很好地使用自闭合标签(如<input />)。

用法是一样的:

@Html.TextBoxFor(model => model.PropertyName).Disable(true)

@Html.DropDownListFor()在和上进行了测试@Html.TextBoxFor()

于 2017-03-31T03:29:07.787 回答
0

对属性使用字典并有条件地添加禁用的属性。

    <div>
        @{ 
            var attribs = new Dictionary<String, object>
                {
                    { "class", "form-control" }
                    ,{ "style",  "display:inline; width:100px;"}
                };

            if (Model.IsFieldDisabled)
            {
                attribs.Add("disabled", true);
            }
        }

        @Html.TextBoxFor(m => m.MinValue, attribs)
        to
        @Html.TextBoxFor(m => m.MaxValue, attribs)
    </div>

添加这个实际上只是为了在上面添加@ITFlyer 答案的更文字版本。他有条件地更改属性名称而不是值的方法很狡猾,并且仍然允许内联。然而,当我第一次看到它时,我错误地认为它不是有条件的,所以我认为更详细的版本仍然有价值,即使它在很大程度上只是重定向到那个答案。

另一个好处是,一个单独的变量还允许在多个控件上重用(在我的情况下我需要

于 2022-01-28T13:50:37.740 回答