Я заполнил форму и получил на сервер такие данные:

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

Есть ли способ упростить и объединить эти строки?

2
Yaroslav Osetrov 18 Апр 2014 в 19:41

4 ответа

Лучший ответ

Вы можете написать метод расширения и использовать отражение для установки своих свойств, например:

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.

3
Selman Genç 18 Апр 2014 в 16:07

Если вы используете 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 представляет кнопку отправки вашей формы, просто это обычная кнопка с обработчиком кликов, и запрос отправки отправляется явно

0
Manish Mishra 18 Апр 2014 в 16:00

Вы можете попробовать Automapper. AFAIK у него нет стандартного преобразования словаря в объект, но здесь я нашел пример, как это сделать с помощью небольшого количества настраиваемого кода:

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

0
Vadim K. 18 Апр 2014 в 16:01

Я бы сделал так:

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 .

0
SuMMeR 18 Апр 2014 в 21:32