Как получить разницу ожидающих изменений в модели в ASP.NET MVC 2 - PullRequest
0 голосов
/ 26 марта 2011

Я работаю над приложением ASP.Net MVC и хочу показать страницу подтверждения после того, как пользователь отредактирует некоторые данные. То, что я хотел бы показать, это список ожидающих изменений, которые пользователь внес в модель. Например,

Вы уверены, что хотите внести следующие изменения:

FieldName:
   Previous Value: XXX
   New Value: YYY

Я знаю, что могу прочитать свое сохраненное значение из базы данных и сравнить его с объектом POSTed, но я хочу, чтобы это работало в целом. Какие были бы хорошие способы приблизиться к этому?

Чтобы уточнить, я ищу общий способ получить "разницу" ожидающих изменений. Я уже знаю, как получить предыдущие и ожидающие изменения. Вроде как TryUpdateModel() может пытаться обновить любую модель с опубликованными значениями. Мне нужен магический метод GetPendingModelChanges(), который может возвращать список чего-то вроде новых PendingChange { Original = "XXX", NewValue = "YYY"} объектов.

Ответы [ 3 ]

1 голос
/ 26 марта 2011

Возможно, вы уже делаете это, но я бы не отправлял свою модель в представление, создавал модель представления. В этом случае я дважды сопоставлю данные модели с моделью представления, моя модель представления может содержать OrderInput и OrderInputOrig. Затем вставьте OrderInputOrig в скрытые поля. При обратной отправке вы можете сравнить значения и затем перенаправить, если что-то изменилось, в экранный вид с оригиналом и изменениями для подтверждения.

Может быть, что-то вроде этого:

[HttpPost]
public ActionResult Edit(CustomerInput cutomerInput)
{
    var changes = PublicInstancePropertiesEqual(cutomerInput.OriginalCustomer, cutomerInput.Customer);

    if (changes != null)
    {
        cutomerInput.WhatChangeds = changes;
        return View("ConfirmChanges", cutomerInput);
    }

    return View();
}

public ActionResult ConfirmChanges(CustomerInput customerInput)
{
     return View(customerInput);
}

from: Сравнение свойств объекта в c #

public static Dictionary<string, WhatChanged> PublicInstancePropertiesEqual<T>(T self, T to, params string[] ignore) where T : class
{
    Dictionary<string, WhatChanged> changes = null;

    if (self != null && to != null)
    {
        var type = typeof(T);
        var ignoreList = new List<string>(ignore);
        foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
        {
            if (!ignoreList.Contains(pi.Name))
            {
                var selfValue = type.GetProperty(pi.Name).GetValue(self, null);
                var toValue = type.GetProperty(pi.Name).GetValue(to, null);

                if (selfValue != toValue && (selfValue == null || !selfValue.Equals(toValue)))
                {
                    if (changes == null)
                        changes = new Dictionary<string, WhatChanged>();

                    changes.Add(pi.Name, new WhatChanged
                                         {
                                            OldValue = selfValue,
                                            NewValue=toValue
                                         });
                }
            }
        }    
        return changes;
    }
    return null;
}
1 голос
/ 05 декабря 2012

Пришел сюда очень поздно, но я создал библиотеку для этого на моделях MVC и предоставлял "читаемые" различия для людей, использующих MVC ModelMetadata:

https://github.com/paultyng/ObjectDiff

Этовыдает вывод при сохранении модели, аналогичной:

Status: 'Live', was 'Inactive'  
Phone: '123-456-7898', was '555-555-5555'

и т. д.

0 голосов
/ 26 марта 2011

используйте словарь TempData.

 TempData["previousValue"];
 TempData["newValue"];
...