简化从表单中获取数据的过程

本文关键字:数据 过程 获取 表单 | 更新日期: 2023-09-27 17:59:00

我填写了表格,并在服务器上收到了如下数据:

model.Firstname = HttpContext.Current.Request.QueryString["Firstname"];
model.Lastname = HttpContext.Current.Request.QueryString["Lastname"];
model.Middlename = HttpContext.Current.Request.QueryString["Middlename"];
model.Avatar = HttpContext.Current.Request.QueryString["Avatar"];
model.Birthday = HttpContext.Current.Request.QueryString["Birthday"];

型号:

public int CustomerID { get; set; }
public int StatusID { get; set; }
public string Firstname { get; set; }
public string Lastname{ get; set; }
public string Middlename { get; set; }
public string Birthday { get; set; }

有没有什么方法可以让它更容易并将这些行组合起来?

简化从表单中获取数据的过程

您可以编写一个扩展方法并使用反射来设置属性,如下所示:

public static void SetProperties<T>(this T source, HttpContext context)
{
     var properties = typeof(T)
             .GetProperties(BindingFlags.Instance | BindingFlags.Public);
     var  values = context.Request.QueryString;
     foreach (var prop in properties)
     {
         if (values.AllKeys.Contains(prop.Name))
         {
             prop.SetValue(source,values[prop.Name]);
         }
     }
}

用法:

mode.SetProperties(HttpContext.Current);

这假设查询字符串中的键与model的属性名称完全匹配。

如果你使用的是asp.net mvc,你不必通过HttpContext专门分配每个属性,你可以直接发送表单的序列化数据,并在函数中作为强类型模型对象接收,比如:

[HttpPost]
public TMServiceResponse Customer_Save(CustomerModel obj)
{
     //make your form actionmethod like this
}

并从如下视图发布:

var form = jQuery("#myformId");
jQuery(".btnCustomerSubmit").on("click", function (e) {
    e.preventDefault();
    var result = form.valid();
    if (result === true) {
        var url = '/ControllerName/Customer_Save';
        var data = form.serialize();
        //send post request using jQuery Ajax
        $.ajax({
           url: url,
           type: "post",
           data: data,
           success:function(msg){}
        });
    }
});

其中.btnCustomerSubmit表示表单的提交按钮,这是一个常见的按钮,带有一个点击处理程序,发布请求显式发送

您可以尝试Automapper。AFAIK没有现成的Dictionary到Object映射,但在这里我找到了一个如何使用少量自定义代码实现这一点的示例:

http://automapper.codeplex.com/workitem/3266

我会这样做:

var queryString = HttpContext.Current.Request.QueryString;
var model = new Model 
{
    Firstname = queryString["Firstname"],
    Lastname = queryString["Lastname"],
    Middlename = queryString["Middlename"],
    Avatar = queryString["Avatar"],
    Birthday = queryString["Birthday"]
};

这比反射更快,也更可靠。如果有人将Model.Firstname重命名为Model.Firstname.

,它不会开始失败(或静默跳过项目)