2012-02-09 4 views
3

Я ищу для создания ненавязчивой каскадной выпадающей системы для веб-сайта, над которым я работаю. У меня возникли проблемы с выяснением того, как заставить различные методы HtmlHelper включать пользовательские атрибуты html в обработанный тег.Добавление атрибутов data- * в MVC3 с помощью атрибута модели представления

Просмотрев исходный код встроенных методов HtmlHelper, все они делают вызов GetUnobtrusiveValidationAttributes, который создает все атрибуты data-val- * html. Это здорово, если вам нужны атрибуты validator, но я хотел бы иметь возможность добавлять другие атрибуты таким образом, не изменяя шаблоны и не создавая новые расширения HtmlHelper.

Возможно ли это? Я что-то пропускаю?

Редактировать

Я знаю, что все методы HtmlHelper имеют перегрузку, которая принимает объект HTML атрибутов. Я пытаюсь избежать этого, если это вообще возможно.

Edit 2

я принципиально хочу, чтобы это произошло:

public class ViewModel 
{ 
    [Cascading(Action="/Controller/Action")] 
    public int Action { get; set; } 
} 

И тогда имеет HtmlHelpers вынести как:

<select data-action="/Controller/Action"></select> 

Но предпочтительно без подправить метод расширения для этого. У меня нет проблем с созданием моего собственного вспомогательного метода, но мне интересно, не хватает ли какой-либо встроенной функции, которая уже рассматривает случайные метаданные модели и может добавлять атрибуты html.

ответ

2

Видя редактирование 1 + 2, я думаю, вам нужно создать свои собственные расширения. Так как вы dealing with dropdowns, вы можете have a look at this implementation, но use custom attributes via IMetadataAware.

IMetadataAware: Этот интерфейс может быть реализован с помощью класса атрибута, так что атрибут может добавлять метаданные в процесс создания модели метаданных без написания пользовательского поставщика метаданных. Этот интерфейс потребляется классом AssociatedMetadataProvider, поэтому это поведение наследуется всеми вытекающими из него классами, такими как класс DataAnnotationsModelMetadataProvider.


Эта часть уже не полезно в качестве ответа

Если вы хотите добавить пользовательские атрибуты к сгенерированной HTML, вы можете использовать параметр Object htmlAttributes доступный на многих помощников, например, в @Html.ActionLink().

Пример с пользовательскими атрибутами data-*, которые могут быть использованы для ненавязчивого инициирования модального диалога для редактирования пользовательских настроек на клиентах с поддержкой javascript. Bootstrap's modal использует что-то похожее на это.

Заметьте, что я using underscores instead of dashes for the data attribute.

@Html.ActionLink(
    "Settings", 
    "CreateOrUpdate", 
    "User", 
    new { id = "1234" }, 
    new { 
     title = "Edit your personal settings", 
     data_show_modal = "#my-user-settings-modal" 
    }) 

В вашем случае, я думаю, вы используете @Html.DropDownList(...), который принимает htmlAttributes, а также.Заполните их, как вам нравится, и пусть ваш javascript подберет правильные атрибуты data-*.

public static MvcHtmlString DropDownList(
    this HtmlHelper htmlHelper, 
    string name, 
    IEnumerable<SelectListItem> selectList, 
    string optionLabel, 
    Object htmlAttributes 
) 
+0

Спасибо, я стараюсь не добавлять все эти значения вручную. Я хочу, чтобы атрибуты html поступали из атрибута модели представления, который я создаю. – rossisdead

+0

О, должно быть, пропустил эту часть в названии. –

+0

Не беспокойтесь, кто-то другой отправил одинаковый ответ, а затем удалил его. Я обновил свой вопрос, чтобы сделать его более понятным. – rossisdead

0

Вы не можете использовать это без использования шаблонов редактора/дисплея или HtmlAttributes.

Шаблоны имеют то преимущество, что вы можете легко добавлять теги в одном месте и распространять их по всему приложению.

0

Я использую производный атрибут в UIHint доставить свойства из модели представления в шаблон редактора, с прекрасным IMetadataAware интерфейсом я только узнал о вчерашнем.

Обратите внимание, как вызов базового конструктора заставляет имя шаблона редактора, который я написал специально, чтобы добавить атрибуты к фактическому помощнику в качестве параметров. Константа KnownUiHints.SelectionOther, переданная в параметр UIHint, равна «SelectionOtherInput», имя шаблона редактора.

Затем вспомогательные параметры доступны для вспомогательного кода.

E.g. Мой DropDownAttribute передает свойства со следующим кодом:

public class SelectionOtherInputAttribute : UIHintAttribute, IMetadataAware 
{ 
    public SelectionOtherInputAttribute(string selectionElementName) : base(KnownUiHints.SelectionOther, KnownPresentationLayers.Mvc) 
    { 
     SelectionElementName = selectionElementName; 
    } 
    public SelectionOtherInputAttribute(string selectionElementName, object otherSelectionKey) : base(KnownUiHints.SelectionOther, KnownPresentationLayers.Mvc) 
    { 
     SelectionElementName = selectionElementName; 
     ControlParameters[SelectionOtherInputControlParameterKeys.OtherSelectionKey] = otherSelectionKey; 
    } 
    public string SelectionElementName { get; set; } 
    public object OtherSelectionKey { get; set; } 
    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["@OtherSelectionAttrinbuteNames.SelectionElementName"] = SelectionElementName; 
     metadata.AdditionalValues["@OtherSelectionAttrinbuteNames.OtherSelectionKey"] = OtherSelectionKey; 
    } 
} 

Вот мой шаблон SelectionOtherInput редактора.

@using OtherInput.Core 
@{ 
    var meta = ViewData.ModelMetadata.AdditionalValues; 
    var selectionElementName = (string)meta["@OtherSelectionAttrinbuteNames.SelectionElementName"]; 
    var otherSelectionKey = meta["@OtherSelectionAttrinbuteNames.OtherSelectionKey"]; 
    var inputElementname = ViewData.TemplateInfo.HtmlFieldPrefix; 
} 
@Html.SelectionOtherTextBoxFor(m => Model, selectionElementName, otherSelectionKey.ToString()) 

Затем я использую мой атрибут следующим образом в модели представления:

[SelectionOtherInput("EmploymentStatusId", 1)] 
public string OtherEmploymentStatus { get; set; } 

Это вызывает OtherEmploymentStatus быть вынесено по шаблону в SelectionOtherInput редактора, который в свою очередь делает мой SelectionOtherTextBoxFor помощник, с атрибутами, передаваемых в качестве аргументы.

Смежные вопросы