MVC EditorFor可选ReadOnly

时间:2016-01-15 04:54:04

标签: c# asp.net-mvc mvc-editor-templates readonly-attribute

昨天,经过大量测试后,我得到以下内容,可选择将readonly属性应用于基于ViewBag.CanEdit的值的控件;

@Html.EditorFor(m => m.Location, new { htmlAttributes = new { @class = "form-control", @readonly = (ViewBag.CanEdit == true ? Html.Raw("") : Html.Raw("readonly")) } })

基于此测试的成功,我在项目的几个部分中实现并测试了它。今天我开始使用代码的一个新部分并开始实现相同的代码只是为了让它始终失败 - 每个控件都是readonly

当我检查控件时,他们要么readonlyreadonly=readonly作为属性?然后我回到昨天重构的代码来找到同样的问题;无论readonly的值是什么,每个控件现在都是ViewBag.CanEdit

任何人都可以解释为什么这会在昨天起作用但今天失败了吗?

2 个答案:

答案 0 :(得分:1)

试试这个

@Html.TextBoxFor(model => model.Location, !ViewBag.CanEdit 
    ? (object)new { @class = "form-control", @readonly ="readonly" } 
    : (object)new { @class = "form-control" })

答案 1 :(得分:1)

作为一种更好的方法,我创建了这个方法,我在我的项目中使用它,每当我需要这样的东西时。它将使您的代码更清晰。

首先,将此类添加到您的项目中:

 public static class HtmlBuildersExtended
    {
        public static RouteValueDictionary ConditionalReadonly(
            bool isReadonly,
            object htmlAttributes = null)
        {
            var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

            if (isReadonly)
                dictionary.Add("readonly", "readonly");

            return dictionary;
        }
   }

然后您可以将代码更改为:

@Html.TextBoxFor(model => model.Location, 
      HtmlBuildersExtended.ConditionalReadonly(
          (bool)ViewBag.CanEdit, new { @class = "form-control" }));

或者如果您想使用EditorFor助手,那么:

@Html.EditorFor(model => model.Location,
             HtmlBuildersExtended.ConditionalReadonly((bool)ViewBag.CanEdit, 
                    new
                    {
                        htmlAttributes = new
                        {
                            @class = "form-control"
                        }
                    }));
相关问题