Asp.net-Mvc

帶有用於 mvc 的 html 編輯器的數據屬性

  • December 3, 2021

編輯器的數據屬性不工作。

@Html.EditorFor(model => model.SireTag, new { data_typeahead = "dsfsdfsd" })

當我打開我的 chrome 瀏覽器時,我看不到我的文本框的任何數據屬性。我嘗試了護目鏡,但沒有發現任何有用的東西。

第二個object參數Html.EditorFor不是用於 HTML 屬性,而是用於附加視圖數據。EditorFor助手不允許以例如更具體的助手<input>所做的方式自定義 HTML 屬性 - 他們從模型元數據(例如[Attributes])中獲取大部分設置。

“修復”的最簡單方法顯然是下降EditorFor

@Html.TextBoxFor(model => model.SireTag, new { data_typeahead = "dsfsdfsd" })

或者,為該屬性編寫您自己的 EditorTemplate。這可以允許您通過從(或“預先輸入”)檢索data_typeahead值來使用(或簡化)原始語法。ViewData["data_typeahead"]

更進一步,更高級,您可以將自己Attribute的應用到您的模型屬性 + 您自己的ModelMetadataProvider(或者 - 更簡單 - 使用IMetadataAware,更多內容見下文)將其轉換為 EditorTemplate 可以使用的元數據 - 這是為了刪除完全從您的視圖中決定data-屬性,將您的呼叫變成:

@Html.EditorFor(model => model.SireTag)

…和你的模型變成這樣的:

public class MyModel
{
   [Typeahead("dsfsdfsd")]
   public string SireTag { get; set; }
}

此方法使用 IMetadataAware 的範例:

[AttributeUsage(AttributeTargets.Property)]
public class TypeaheadAttribute : Attribute, IMetadataAware
{
   private readonly string value;

   public TypeaheadAttribute(string value)
   {
      this.value = value;
   }

   public void OnMetadataCreated(ModelMetadata metadata)
   {
       metadata.AdditionalValues["typeahead"] = value;
   }
}

然後可以使用ViewContext.ViewData.ModelMetadata.AdditionalValues(字典)在 EditorTemplate 中提取此元數據條目,並將結果添加到傳遞給 eg 的屬性字典中Html.TextBox

實際上,您可以使用 EditorFor 並發送額外的 HTML 屬性。使用此重載並設置additionalViewData參數。它需要一個具有htmlAttributes屬性的對象:

@Html.EditorFor(
   model => model.SireTag,
   new { 
       htmlAttributes = new { data_typeahead = "dsfsdfsd" }
   }
)

這將產生類似的東西:

<input id="SireTag" name="SireTag" ... data-typeahead="dsfsdfsd">

引用自:https://stackoverflow.com/questions/18177335