Атрибуты HTML для EditorFor () в ASP.NET MVC - PullRequest
126 голосов
/ 17 сентября 2010

Почему я не могу передать атрибуты html EditorFor()?например;

<%= Html.EditorFor(model => model.Control.PeriodType, 
    new { disabled = "disabled", readonly = "readonly" }) %>

Я не хочу использовать метаданные

Обновление : Решением было вызвать это из представления:

 <%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>

и используйте ViewData["Modifiable"] в моем пользовательском EditorTemplates / String.ascx, где у меня есть некоторая логика представления, которая определяет, добавлять ли атрибуты только для чтения и / или отключенные к входным данным. Анонимный объект, переданный в EditorFor(), представляет собой параметр с именем additionalViewData и егосвойства передаются в шаблон редактора в коллекции ViewData.

Ответы [ 14 ]

1 голос
/ 08 ноября 2012

Просто создайте свой собственный шаблон для типа в Views / Shared / EditorTemplates / MyTypeEditor.vbhtml

@ModelType MyType

@ModelType MyType
@Code
    Dim name As String = ViewData("ControlId")
    If String.IsNullOrEmpty(name) Then
        name = "MyTypeEditor"
    End If
End Code

' Mark-up for MyType Editor
@Html.TextBox(name, Model, New With {.style = "width:65px;background-color:yellow"})

Вызовите редактор из вашего представления со свойством модели:

@Html.EditorFor(Function(m) m.MyTypeProperty, "MyTypeEditor", New {.ControlId = "uniqueId"})

Pardonсинтаксис VB.Вот так мы катимся.

1 голос
/ 14 августа 2012

Я боролся с той же проблемой сегодня за флажок, который связывает с недействительным bool, и, поскольку я не могу изменить свою модель (не мой код), мне пришлось придумать лучший способ справиться с этим.Это немного грубая сила, но она должна работать в 99% случаев, с которыми я могу столкнуться.Вам, очевидно, придется выполнить некоторую ручную загрузку допустимых атрибутов для каждого типа ввода, но я думаю, что я получил все из них для флажка.

В моем шаблоне редактора Boolean.cshtml:

@model bool?

@{
    var attribs = new Dictionary<string, object>();
    var validAttribs = new string[] {"style", "class", "checked", "@class",
        "classname","id", "required", "value", "disabled", "readonly", 
        "accesskey", "lang", "tabindex", "title", "onblur", "onfocus", 
        "onclick", "onchange", "ondblclick", "onmousedown", "onmousemove", 
        "onmouseout", "onmouseover", "onmouseup", "onselect"};
    foreach (var item in ViewData) 
    {
        if (item.Key.ToLower().IndexOf("data_") == 0 || item.Key.ToLower().IndexOf("aria_") == 0) 
        {
            attribs.Add(item.Key.Replace('_', '-'), item.Value);
        } 
        else 
        {
            if (validAttribs.Contains(item.Key.ToLower()))
            {
                attribs.Add(item.Key, item.Value);
            }
        }
    }
}

@Html.CheckBox("", Model.GetValueOrDefault(), attribs)
1 голос
/ 26 июля 2012
Html.TextBoxFor(model => model.Control.PeriodType, 
    new { @class="text-box single-line"})

вы можете использовать как это; тот же вывод с Html.EditorFor, и вы можете добавить свои атрибуты HTML

0 голосов
/ 26 августа 2014

Решение MVC 5.1 и выше (объединит локальные атрибуты Html и определены в шаблонах Editor):

Shared \ EditorTemplates \ String.cshtml:

@Html.TextBoxFor(model => model, new { @class = "form-control", placeholder = ViewData.ModelMetadata.Watermark }.ToExpando().MergeHtmlAttributes(ViewData["htmlAttributes"].ToExpando()))

Расширения:

public static IDictionary<string, object> MergeHtmlAttributes(this ExpandoObject source1, dynamic source2)
{
    Condition.Requires(source1, "source1").IsNotNull().IsLongerThan(0);

    IDictionary<string, object> result = source2 == null
        ? new Dictionary<string, object>()
        : (IDictionary<string, object>) source2;

    var dictionary1 = (IDictionary<string, object>) source1;

    string[] commonKeys = result.Keys.Where(dictionary1.ContainsKey).ToArray();
    foreach (var key in commonKeys)
    {
        result[key] = string.Format("{0} {1}", dictionary1[key], result[key]);
    }

    foreach (var item in dictionary1.Where(pair => !result.ContainsKey(pair.Key)))
    {
        result.Add(item);
    }

    return result;
}

public static ExpandoObject ToExpando(this object anonymousObject)
{
    IDictionary<string, object> anonymousDictionary = new RouteValueDictionary(anonymousObject);
    IDictionary<string, object> expando = new ExpandoObject();
    foreach (var item in anonymousDictionary)
        expando.Add(item);
    return (ExpandoObject)expando;
}

public static bool HasProperty(this ExpandoObject expando, string key)
{
    return ((IDictionary<string, object>)expando).ContainsKey(key);
}

Использование:

@Html.EditorFor(m => m.PromotionalCode, new { htmlAttributes = new { ng_model = "roomCtrl.searchRoomModel().promoCode" }})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...