2014-11-24 2 views
0

У меня есть большая форма о деталях клиента, которая содержит около 50 полей. Клиент может обновлять свою информацию, например, адрес и номер контакта. Когда он редактирует свой профиль, ему представлены все 50 полей ввода, редактируемых. Когда он редактирует, например, только поле адреса, я хочу определить измененное поле в POST, чтобы отправлять только эти поля в базовую систему (SAP).Как определить измененные поля в asp.net mvc?

Это то, что я сделал до сих пор,

  1. Обновление всех 50 полей в системе, потому что я не в состоянии определить, какие поля были изменены.
  2. Чтобы определить только измененные поля, я сохранил еще 50 полей в поле viewModel и после сопоставления соответствующих полей, чтобы определить, какие поля изменены.

Но, как очевидно, эти оба метода являются плохими методами проектирования, и они добавляют дополнительные накладные расходы к производительности.

Я хочу знать, как мы можем определить измененные поля в POST, чтобы только отправлять запрос на обновление только для модифицированных полей.

Оцените свою информацию об этом.

+0

Есть много способов сделать это, начиная от того, отдельных запросов для каждого поля (в линии редактирования) для отслеживания измененных полей в клиенте с помощью JavaScript и в том числе списка в ваш запрос POST. Это довольно широкая тема. –

+0

Спасибо @AntP, не могли бы вы указать мне в правильном направлении? Я хотел бы отслеживать измененные поля в клиенте и захватывать эту информацию в контроллере. –

+0

Если структура модели каким-то образом _simple_, вы можете сделать что-то похожее на то, что объяснено в этом сообщении: [Сравнение двух объектов путем повторной рекурсии через все свойства свойств] (http://stackoverflow.com/a/25064247/1207195). –

ответ

1

Я столкнулся с подобной проблемой при создании API с использованием Web API 2 и EF6.

У меня есть сущность со многими полями, и я хочу только обновить поля, полученные в json.

Таким образом, вместо того, чтобы использовать десериализатор ASP и получить объект разобраны

как так:

public IHttpActionResult Update(int id, Product product) { ... } 

Я извлекал продукт от вызова

public IHttpActionResult Update(int id){ ... } 

функции Прочитайте JSON из Орган, подавший заявку

var rawBody = Request.Content.ReadAsStringAsync().Result; 

десериализатор содержание JSON в словаре поля и значения

Dictionary<string, string> rawProduct = JsonConvert 
       .DeserializeObject<Dictionary<string, string>>(rawBody); 

построения объекта обновление

var product = JsonConvert.DeserializeObject<Product>(rawBody); 

Извлеките ключ Id из словаря поля обновление

rawProduct.Remove("Id"); 

Приложите изделие к контексту

dbContext.Products.Attach(product); 

Прокрутите все свойства объекта, который проверяет, какие из них присутствуют в словаре, и установите для их измененного атрибута значение true.

foreach(var p in product.GetType().GetProperties()){ 
    if(rawProduct.ContainsKey(p.Name)) { 
     dbContext.Entry(product).Property(p.Name).IsModified = true; 
    } 
} 

Полный код:

public IHttpActionResult Update(int id){ 

    var rawBody = Request.Content.ReadAsStringAsync().Result; 

    Dictionary<string, string> rawProduct = JsonConvert 
        .DeserializeObject<Dictionary<string, string>>(rawBody); 

    var product = JsonConvert.DeserializeObject<Product>(rawBody); 

    rawProduct.Remove("Id"); 

    dbContext.Products.Attach(product); 

    foreach(var p in product.GetType().GetProperties()){ 
     if(rawProduct.ContainsKey(p.Name)) { 
      dbContext.Entry(product).Property(p.Name).IsModified = true; 
     } 
    } 

    dbContext.SaveChanges(); 
} 
0

Подобный раствор из @klimslava. Разница в том, что вместо того, чтобы установить property's IsModified в true. Я прочитал текущий Product, а затем установил для него значение. В противном случае, вы получите DbEntityValidationException

public IHttpActionResult Update(int id){ 
    var rawBody = Request.Content.ReadAsStringAsync().Result; 

    Dictionary<string, string> rawProduct = JsonConvert 
       .DeserializeObject<Dictionary<string, string>>(rawBody); 

    var product = JsonConvert.DeserializeObject<Product>(rawBody); 

    rawProduct.Remove("Id"); 

    var currentProduct = dbContext.Products.Find(product.Id); 

    foreach(var p in product.GetType().GetProperties()){ 
     if(rawProduct.ContainsKey(p.Name)) { 
      p.SetValue(currentDocument, p.GetValue(document)); 
     } 
    } 

    dbContext.SaveChanges(); 
} 
Смежные вопросы