0

我有一个带有字符串属性的 mvc 模型,当我收到在客户端上设置为空字符串的 json 参数时,我收到 null i mvc 控制器对字符串参数的操作。

我希望能够接收一个空字符串而不是 null 并尝试了以下操作:

[MetadataType(typeof(TestClassMetaData))]
public partial class TestClass
{
}

public class TestClassMetaData
{
     private string _note;

    [StringLength(50, ErrorMessage = "Max 50 characters")]
    [DataType(DataType.MultilineText)]
    public object Note
    {
        get { return _note; }
        set { _note = (string)value ?? ""; }
    }

}

使用它会产生验证错误。

有谁知道为什么它不起作用?

还有为什么元数据类使用对象作为属性类型?

4

2 回答 2

1

添加属性:

[Required(AllowEmptyStrings = true)]

Note(实际上应该是 type string)的属性定义。

于 2013-10-19T15:08:35.540 回答
1

默认情况下使用默认DefaultModelBinder值为.ConvertEmptyStringToNulltrue

如果你想改变这种行为,你应该使用DisplayFormat属性并将属性设置ConvertEmptyStringToNullfalse字符串属性。

public class YourModel
{
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string StringProperty { get; set; }

    //...
}

我尚未检查填充解决方案,但您可以尝试并为项目中的所有字符串属性实现自定义模型绑定器。

public class CustomStringBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        bindingContext.ModelMetadata.ConvertEmptyStringToNull = false;
        return base.BindModel(controllerContext, bindingContext);
    }
}

实现自定义字符串绑定后,您应该在 Global.asax.cs 中注册它

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(string), new StringBinder());
    }
}

我希望这段代码有效。

于 2013-10-19T18:15:42.327 回答