繁体   English   中英

如何在asp.net MVC 4中链接活页夹?

[英]How to chain binders in asp.net MVC 4?

我刚刚在asp.net MVC中编写了我的第一个模型活页夹。 我从纯HTML表单开始,该表单的所有输入均以“ fm_”为前缀。

public class HuggiesModel
{
    public string fm_firstname { get; set; }
    public DateTime fm_duedate { get; set; }
}

默认的活页夹工作正常,我认为这可以节省时间。

然后,我决定想要更清晰的属性名称,因此我更改为:

[ModelBinder(typeof(HuggiesModelBinder))]
public class HuggiesModel
{
    public string FirstName { get; set; }
    public DateTime? DueDate { get; set; }
}

和模型活页夹:

public class HuggiesModelBinder : IModelBinder
{
    private HttpRequestBase request;

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException("bindingContext");

        this.request = controllerContext.HttpContext.Request;

        var model = new HuggiesModel
        {
            FirstName = GetQueryStringValue("fm_firstname"),
        };

        string dateTimeString = GetQueryStringValue("fm_duedate");
        model.DueDate = string.IsNullOrWhiteSpace(dateTimeString) 
                                    ? default(DateTime?) 
                                    : DateTime.Parse(dateTimeString);

        return model;
    }

    private string GetQueryStringValue(string key)
    {
        if (this.request.HttpMethod.ToUpper() == "POST")
            return this.request.Form[key];
        return this.request.QueryString[key];
    }
}

有没有一种方法可以实现,从而避免我必须解析DateTime并获取默认的资料夹来替我做到这一点?

注意事项

我意识到我可以更改表单输入名称以匹配我想要的模型名称,但是我故意这样做并不是为了获得编写模型绑定程序的经验,这导致我提出了这个问题。

问题的标题基于我正在尝试做的概念性想法-创建一个看起来像这样的链:

request
  -> default model binder binds get/post data to first view model
         -> my model binder binds first view model to second view model
               -> controller action method is called with second view model

您可以扩展DefaultModelBinder而不是实现IModelBinder。

这是一个例子

    public class HuggiesModelBinder:DefaultModelBinder
    {
        protected override void BindProperty( ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor )
        {
            if (propertyDescriptor.PropertyType == typeof(DateTime))
            {

                base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
            }
            // bind the rest of the properties here
        }
    }

但是,如果我们考虑更现实的情况,即您的HuggiesModel由复杂类型加简单类型组成(如您现在所拥有的),则可以将Default Model绑定与简单类型一起使用(与命名约定一起使用-即拥有FirstName属性)的fm_firstname)。 对于复杂类型,您将为每种类型实现自定义模型绑定程序。 您不一定需要为“ HuggiesModel”使用1个大型自定义模型活页夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM