首页 > 解决方案 > 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, ]}
}

标签: c#asp.netasp.net-mvc

解决方案


推荐阅读