在我的视图模型中将POST参数合并到单个属性中

时间:2011-07-22 13:36:33

标签: asp.net-mvc asp.net-mvc-3 templates html-helper

在我的注册表格中,我必须允许用户输入他的出生日期。这是一个要求,我显示当天的SELECT,月份的SELECT和年份的SELECT。

我制定了一个Html助手扩展程序,用于创建该架构,并命名控件propertyName+".day"propertyName+".month"propertyName+".year"

我的想法是在我的视图模型中,我定义了一个DateTime属性,然后调用这个帮助器:@Html.DateSelect(m=>m.DateOfBirth),但问题是我不知道如何合并前面的3个属性再次DateTime

我会得到3个名为dateofbirth.daydateofbirth.monthdateofbirth.year的POST参数。

如何在MVC3中完成?

谢谢

2 个答案:

答案 0 :(得分:2)

你可以写一个custom model binder

答案 1 :(得分:1)

您需要使用自定义模型装订器:

public class SplitDateTimeBinder : IModelBinder 
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {

        ValueProviderResult day = bindingContext.ValueProvider.GetValue("propertyName.day");
        ValueProviderResult month = bindingContext.ValueProvider.GetValue("propertyName.month");
        ValueProviderResult year = bindingContext.ValueProvider.GetValue("propertyName.year");

        DateTime result = new DateTime(int.Parse(year), int.Parse(month), int.Parse(day));

        return user;
    }
}

并在Global.asax中注册:

ModelBinders.Binders.Add(typeof(DateTime), new SplitDateTimeBinder());

我在示例中使用了int.Parse(),但您可能希望使用int.TryParse()并正确处理失败的解析。