简化从表单中获取数据

时间:2014-04-18 15:41:06

标签: c# asp.net query-string httpcontext

我填写了表单,并在服务器上收到了这样的数据:

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; }

有没有办法让它变得更容易并将这些线组合在一起?

4 个答案:

答案 0 :(得分:3)

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

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的属性名称完全匹配。

答案 1 :(得分:0)

如果您使用的是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表示表单的提交按钮,就是这样,它是常用按钮,带有单击处理程序并且明确发送了发布请求

答案 2 :(得分:0)

您可以尝试Automapper。 AFAIK它没有开箱即用的字典到对象的映射,但是在这里我找到了一个例子,如何用很少的自定义代码来做到这一点:

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

答案 3 :(得分:0)

我会这样做:

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 ,它就不会开始失败(或默默跳过项目)。