【问题标题】:How to make a custom string object modelbind in MVC?如何在 MVC 中制作自定义字符串对象模型绑定?
【发布时间】:2011-04-14 02:05:23
【问题描述】:

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

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

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);
    }
}

【问题讨论】:

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


    【解决方案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 时,应该正确绑定操作参数。

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

    【讨论】:

    • 是的,这就是我要找的达林!谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多