.net mvc5是否可以根据特定规则绑定属性?所以例如,我有时间输入(例如10.30),我需要将其绑定到double。我希望有一些类似的东西:
// Model
[CustomAttribute("TimeAttr")]
public double Hours { get; set; }
// Binding
public TimeAttrBinder : IModelBinder
{
// Replace colons with dots
return double.Parse(value.Replace(':', '.'));
}
// Global
ModelBinders.add("TimeAttr", TimeAttrBinder)
这样我就可以在模型中的属性上添加注释,并且每次都将自定义模型绑定...
在.net mvc5中是否可以这样做?
答案 0 :(得分:1)
没有内置机制,但您可以构建一个自定义PropertyBinder属性,该属性仅对给定属性应用模型绑定器,如本文所示:http://aboutcode.net/2011/03/12/mvc-property-binder.html
你可以使它非常通用,如文章中所示,但为了说明你可以尝试这样的概念。
元数据感知标记属性:
public class MyMarkerAttribute : Attribute, IMetadataAware
{
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["marker"] = true;
}
}
将了解此标记属性的自定义模型绑定器:
public class MyModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelMetadata.AdditionalValues.ContainsKey(MyMarkerAttribute.MarkerKey))
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value != null)
{
// Here you could implement whatever custom binding logic you need
// for your property from the binding context
return value.ConvertTo(typeof(double));
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
然后使用Application_Start
中的自定义模板绑定器替换默认模型绑定器:
ModelBinders.Binders.DefaultBinder = new MyModelBinder();
这就是它。现在,您可以使用marker属性修饰视图模型:
[MyMarker]
public double Hours { get; set; }