我一直在按照本指南创建自定义显示属性(特别是额外的 html 属性)以应用于我的 ViewModel 中的属性。我已经覆盖了 EditorTemplates 文件夹中的 String 和 Boolean。编辑器模板检查是否已设置值/是否已使用显示属性 - 并添加额外的 html 属性。
不过,在执行编辑操作时,我卡在了布尔覆盖上。无论我是否将属性应用到字符串,ViewModel 总是映射到正确的现有数据。这不适用于任何其他表单输入类型,因为模板是通过更改 TextBoxFor 中的 type 属性来编写的。
我一直在写这篇文章,主要是因为我一直在研究淘汰赛,并且想要一种简单的方法将 data-bind 属性应用于强类型视图 - 如果有更好的方法,请告诉我!
属性代码:
public class Knockout : Attribute
{
public string DataBind { get; set; }
public string InputType { get; set; }
/*
Example:
Knockout("checked: showUploader", "checkbox")
Adds the HTML attributes data-bind="checked: showUploader" type="checkbox"
*/
public Knockout(string dataBind, string inputType)
{
this.DataBind = dataBind;
this.InputType = inputType;
}
public Dictionary<string, object> OptionalAttributes()
{
var options = new Dictionary<string, object>();
if(!string.IsNullOrWhiteSpace(DataBind))
{
options.Add("data-bind", DataBind);
}
if (!string.IsNullOrWhiteSpace(InputType))
{
options.Add("type", InputType);
}
return options;
}
}
模板代码
@using CumbriaMD.Infrastructure.ViewModels.DisplayAttributes
@{
var key = "Knockout";
}
@if (ViewData.ModelMetadata.AdditionalValues.ContainsKey(key))
{
var knockout = ViewData.ModelMetadata.AdditionalValues[key] as Knockout;
@Html.TextBoxFor(model => model, knockout.OptionalAttributes())
}
else
{
/*
When the attribute is not present, the default action is the following - which seems to
be overriding the data mapped from the database:
*/
@Html.TextBoxFor(model => model, new { type="checkbox" })
}