c# - MVC 如何将表单数据序列化为模型?
问题描述
MVC 如何从表单数据中设置对象的属性?
例如:
[HttpPost]
public ActionResult Method(SomeModel model) <---
{
....
}
我尝试过使用反射进行投射:
此问题的要求必须涉及从表单的 NameValueCollection 创建不同类型的对象。
我试图投射到一个合适的对象。这有效,除非基本模型的子属性是 Dictionary、KeyValuePair 等类型,还有其他解决方法吗?
public static object CastFormNew(this NameValueCollection Form, Type type, string FormValueName = null)
{
object value = type.DefaultValue();
try
{
if (!type.IsSimple())
{
var model = Activator.CreateInstance(type);
foreach (string kvp in Form.AllKeys)
{
PropertyInfo pi = type.GetProperty(kvp, BindingFlags.Public | BindingFlags.Instance);
if (pi != null)
{
pi.SetValue(model, Form[kvp], null);
}
}
value = model;
}
else
{
var FormValues = new Dictionary<string, object>();
Form.CopyTo(FormValues);
if (FormValues.ContainsKey(FormValueName))
value = FormValues[FormValueName];
}
}
catch { }
return value;
}
模型:
public class ExampleModel
{
//Default formats to search for
public readonly string[] DateTimeFormats =
{
"yyyy-MM-dd",
"MM/dd/yyyy",
"MM-dd-yyyy"
};
[Display(Name = "Date Format")]
public string DateTimeFormat { get; set; } = "MM/dd/yyyy";
Dictionary<long, int?> FieldColumnPairs { get; set; }
}
表单值:
{
"DateTimeFormat":"MM/dd/yyyy",
"FieldColumnPairs[0].Key":1,
"FieldColumnPairs[0].Value":5,
"FieldColumnPairs[1].Key":2,
"FieldColumnPairs[1].Value":5,
"FieldColumnPairs[2].Key":3,
"FieldColumnPairs[2].Value":5,
}
实际结果:
{
DateTimeFormat: "MM/dd/yyyy",
FieldColumnPairs: null
}
预期结果:(来自 Visual Studio 调试器中的本地人)
{
DateTimeFormat: "MM/dd/yyyy",
FieldColumnPairs: Count = 33
[0] {[1,5]}
[1] {[2,5]}
[2] {[3,5]}
[3] {[4, ]}
}