模型绑定单个属性

时间:2014-03-03 13:18:05

标签: c# .net asp.net-mvc-5

.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中是否可以这样做?

1 个答案:

答案 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; }