如何在MVC中创建自定义字符串对象模型绑定?

时间:2011-04-13 14:55:18

标签: c# asp.net-mvc modelbinders model-binding custom-model-binder

我创建了一个自定义字符串对象,但是当我将其发布回服务器时它没有模型绑定。是否有我在课堂上缺少的属性或什么?

这是下面的自定义字符串类:

public class EMailAddress
{
    private string _address;
    public EMailAddress(string address)
    {
        _address = address;
    }
    public static implicit operator EMailAddress(string address)
    {
        if (address == null)
            return null;
        return new EMailAddress(address);
    }
}

1 个答案:

答案 0 :(得分:1)

为了使对象被默认的模型绑定器正确绑定,它必须具有默认的无参数构造函数:

public class EMailAddress
{
    public string Address { get; set; }
}

如果您想使用您展示的模型,则需要编写自定义模型绑定器来处理转换:

public class EmailModelBinder : DefaultModelBinder
{
    public override object BindModel(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext
    )
    {
        var email = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (email != null)
        {
            return new EMailAddress(email.AttemptedValue);
        }
        return new EMailAddress(string.Empty);
    }
}

将在Application_Start注册:

ModelBinders.Binders.Add(typeof(EMailAddress), new EmailModelBinder());

并像这样使用:

public class HomeController : Controller
{
    public ActionResult Index(EMailAddress email)
    {
        return View();
    }
}

现在,当您查询/Home/Index?email=foo@bar.baz时,应正确绑定action参数。

现在的问题是:当你可以将视图模型作为我最初展示的模型时,你真的想要编写所有这些代码吗?