使用泛型将asp.net表单请求变量处理为业务对象

时间:2009-08-03 01:59:56

标签: c# asp.net generics reflection webforms

使用jquery将值发布回asp.net webform。我有一些代码可以很好地将发布的Form值粘贴到我的对象中,基本上它将表单值转换为我的类中每个属性的正确类型。

if (Request.Form.HasKeys())
{
    foreach (var key in Request.Form.AllKeys)
    {
        PropertyInfo itemProperty = _CmsItem.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance);

        var value = Request.Form[key];
        if (itemProperty != null)
        {
            itemProperty.SetValue(_CmsItem, Convert.ChangeType(value, itemProperty.PropertyType), null);
        }
    }
    // Doing some processing with my object
}

现在我遇到了如何处理像MyKeys = 123,13332,232323这样的字符串的困境 并将其放入我的对象中的数组或列表中。处理这种情况的最佳方法是什么?

澄清:我已经构建了页面来处理常规表单帖子以及基于requestmode标志的$ ajax回调帖子,因此可以根据不同的情况重新使用页面的页面/部分。

1 个答案:

答案 0 :(得分:1)

以上面提供的格式解析列表的最简单方法是使用string.Split(...)

处理从JavaScript到服务器的列表和对象的理想方法是使用JSON。这对大多数开发人员来说是标准化和直观它还有一个额外的好处,就是可以使用通用API轻松解析ASP.NET。

在下面的示例中,我假设列表的值实际上是“[123,13332,232323]”(没有引号)。这会将值转换为字符串数组。它使用JavaScriptSerializer class进行JSON解析。此类要求您的项目引用System.Web.Extensions DLL,它是.NET 3.5框架的一部分,但默认情况下并不总是包含在项目中。

using System.Web.Script.Serialization;

[...]

if (Request.Form.HasKeys())
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    foreach (var key in Request.Form.AllKeys)
    {
        var value = Request.Form[key];

        var list = serializer.Deserialize<string[]>(value);

    }
}

我刚刚使用其他类型测试了这个(除了string[]),Deserialize<T>()方法也会将对象转换为int[]List<string>和{{ 1}},所以它非常动态,并且不需要花费很多精力来解析。