2011-04-06 28 views
0

我有一个模型集合asp.net的MVC结合特定模型

public class Model 
{ 
    IEnumerable<ModelPart> Parts {get;set;} 
} 

public class Parts 
{ 
    public string Prop1 {get;set;} 
    public string Prop2 {get;set;} 
} 

但在URL正在添加的是很讨厌的。

它具有这样的形式

dhxGridObj_d3BIc6JfDidc_1_0 = & dhxGridObj_d3BIc6JfDidc_1_1 = SSSSS & dhxGridObj_d3BIc6JfDidc_1_2 = SSSSSS & dhxGridObj_d3BIc6JfDidc_2_0 = & dhxGridObj_d3BIc6JfDidc_2_1 = AAAA & dhxGridObj_d3BIc6JfDidc_2_2 = AAAAA

它三个部分以下划线

dhxGridObj_d3BIc6JfDidc_2_1分离

  1. 一些ID dhxGridObj_d3BIc6JfDidc
  2. 行ID 2
  3. 小区ID 1

我想知道什么是最好的方式结合这对我的模型。

我在考虑将这个dhxGridObj_d3BIc6JfDidc_2_1重命名为model[2].Prop1哪里可以做到这一点?

回答

2

哦,是的,这是一个丑陋的请求字符串的地狱。自定义模型绑定器是解析这个野兽的方法,直到找到这个问题的真正解决方案,这当然是修复发送这个垃圾的系统以符合默认的模型绑定器语法。

而且这里有一些划痕代码,可能让你在正确的轨道上的例子:

public class MyModelBinder : DefaultModelBinder 
{ 
    private const string Prefix = "dhxGridObj_d3BIc6JfDidc"; 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = base.BindModel(controllerContext, bindingContext) as Model; 
     var request = controllerContext.HttpContext.Request; 
     model.Parts = request 
      .Params 
      .Keys 
      .OfType<string>() 
      .Select(key => Regex.Match(key, Prefix + "_([0-9]+)_([0-9]+)")) 
      .Where(x => x.Success) 
      .Select(x => new 
      { 
       Row = x.Groups[1].Value, 
       Col = x.Groups[2].Value 
      }) 
      .GroupBy(x => x.Row) 
      .Select(x => new Parts 
      { 
       Prop1 = request[string.Format("{0}_{1}_{2}", Prefix, x.Key, x.ElementAt(0).Col)], 
       Prop2 = request[string.Format("{0}_{1}_{2}", Prefix, x.Key, x.ElementAt(1).Col)], 
      }); 
     return model; 
    } 
} 

将在Application_Start注册:

ModelBinders.Binders.Add(typeof(Model), new MyModelBinder()); 
+0

忘了提也有一些验证的零部件类事情。我看了一下defaultmodelbinder类。有几个方法可以覆盖。你能给出一个暗示哪一个最适合这个吗? – user256034 2011-04-06 12:00:55

+0

@ user256034,你从'DefaultModelBinder'派生并覆盖'BindModel'方法,在那里你执行解析这些丑陋的查询字符串参数并将它们绑定到它们相应的属性值的逻辑。 – 2011-04-06 12:07:45

+0

哇,真棒。奇迹般有效。但我想我必须自己做验证,不是吗? – user256034 2011-04-07 07:57:18