我有一个带集合的模型
public class Model
{
IEnumerable<ModelPart> Parts {get;set;}
}
public class Parts
{
public string Prop1 {get;set;}
public string Prop2 {get;set;}
}
但是网址的传播是非常讨厌的。
它有这种形式
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
dhxGridObj_d3BIc6JfDidc
2
1
我想知道将这个绑定到我的模型的最佳方法是什么。
我在考虑将此dhxGridObj_d3BIc6JfDidc_2_1
重命名为model[2].Prop1
哪里最适合这样做?
答案 0 :(得分: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());
答案 1 :(得分:0)
您不应在MVC应用程序的url中使用查询字符串参数。最好的是Url路线。你可以在这里找到一篇关于MVC路线的好文章:
http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx