ASP.NET MVC2 - 自定义模型绑定器示例

16

我正在尝试寻找一些构建自定义模型绑定器的示例,以处理我需要处理的独特绑定场景,但我发现所有找到的文章都是针对旧版本的MVC,这些已经在MVC2中不再适用。我一直在参考DefaultModelBinder源代码,试图对我需要做的事情有一个大致的了解,但它比我的场景复杂得多,而且我很难分离出需要实现的具体逻辑。

我的目标是获取一个Checkbox/Textbox键值对集合,对于所有选中的键值对,我想创建一个以Checkbox的值为键,关联的Textbox的值为值的键值对。收集这些数据后,我需要对该集合进行一些字符串序列化,以便将其存储在期望的模型类型的字符串属性中。我已经以可管理的格式从表单中接收到了数据,可以让我将给定的Checkbox与特定的Textbox相关联,只是需要弄清楚如何将所有的内容组合起来。

有没有人知道一些最新的教程,可以帮助我开始构建自定义模型绑定器呢?

2个回答

12

我不知道你为什么认为自定义模型绑定器方面自 MVC 1 以来已经发生了很多变化。但是,如果我理解你的意图,那么这应该是相当容易的。

public class CustomModelBinder : DefaultModelBinder {
    public override object BindModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext) {

        NameValueCollection form = controllerContext.HttpContext.Request.Form;
        //get what you need from the form collection

        //creata your model
        SomeModel myModel = new SomeMode();
        myModel.Property = "value";
        //or add some model errors if you need to
        ModelStateDictionary mState = bindingContext.ModelState;
        mState.Add("Property", new ModelState { });
        mState.AddModelError("Property", "There's an error.");

        return myModel; //return your model
    }
}

你的操作:

public ActionResult Contact([ModelBinder(typeof(CustomModelBinder))]SomeModel m){
    //...
}

这是否是您正在寻找的信息类型?


2
这种技术对我非常有效,但是我印象中应该使用bindingContext.ValueProvider而不是直接访问HttpContext(出于可测试性的原因)。 - Nathan Taylor
@Nathan Taylor,我明白了。在这种情况下,这里描述的技术可能会帮助你入门。http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx S. Hanselman还提供了一个关于如何测试绑定器的示例:https://dev59.com/LnVC5IYBdhLWcg3wjx_u#589250 - Çağdaş Tekin
此外,如果您想基于特定(或通用)类型进行模型绑定,请查看此处的帖子:https://dev59.com/0HI_5IYBdhLWcg3wMf9_ - Andrew Dunkman

1

1
网站挂了,示例应该发布在这里 - 而不是外部网站。 - Jim Geurts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接