Я работаю над проектом ASP.NET MVC, который позволит пользователям выполнять пакетные изменения атрибутов объектов. Реализация в своего рода «мастера» как форма с четырьмя фазами в процессе следующим образом:TryUpdateModel работает не так, как ожидалось
- «Выберите атрибуты, которые нужно изменить» - первая страница будет представлять пользователю список флажков, представляющих каждый из атрибутов, которые они хотят редактировать. Пользователь должен проверить атрибуты, которые они должны отредактировать, и выбрать «Продолжить».
- «Редактировать выбранные атрибуты» - вторая страница представит пользователю список отдельных «редакторов», который будет уникален для каждого из атрибутов, выбранных на первой странице.
- «Просмотрите свои изменения» - эта страница позволит пользователю просмотреть изменения, которые они сделали, с выбранными атрибутами.
- «Отправить свои изменения» - эта страница будет фактически отправлять информацию об изменениях, которые пользователь хочет сделать для выбранных атрибутов для выбранной коллекции объектов.
Довольно прямолинейный.
Как я уже упоминал, «редактор» будет уникальным для каждого атрибута и может содержать любую комбинацию различных элементов управления. После того, как пользователь внесла свои исправления и сообщения приложения, информация на странице «Обзор», где у меня сейчас возникают проблемы.
Мы разработали концепцию класса EditorWorker, которая уникальна для каждого атрибута, который отвечает за создание ViewModel, необходимого для каждого редактора, но также несет ответственность за создание/возвращение (на странице «Обзор») действие контроллера) объект, который является «модельным» объектом для редактора, к которому могут быть привязаны почтовые данные, которые затем могут использоваться для отображения отредактированных данных для проверки. Этот объект должен иметь свойства, которые соответствуют идентификаторам элементов управления в редакторе, так что может возникнуть привязка модели.
У меня есть «EditorWorker», создающий и возвращающий необходимый класс, но по какой-то причине, когда я вызываю TryUpdateModel
и передаю в этом классе, его свойства не заполняются в результате вызова этого метода, поскольку я ожидал бы их. Я проверил, что значения находятся в опубликованном FormCollection. Ниже приведен код моего действия с контроллером, где я пытаюсь это сделать. Если кто-то может помочь мне понять, почему TryUpdateModel
не работает в этом сценарии, я был бы очень благодарен.
[HttpPost]
public virtual ActionResult Review(ReviewBatchViewModel model)
{
var selectedAttributes = GetSelectedAttributes(model.SelectedAttributeIds.Split(',').Select(i => Int64.Parse(i)).ToArray());
var workers = new List<IEditorWorker>();
var reviewData = new Dictionary<ViewAttribute, IEditData>();
foreach (var attribute in selectedAttributes)
{
if (!string.IsNullOrEmpty(attribute.EditorWorker)) // If there is no EditorWorker defined for this object, move on...
{
var worker = ServiceLocator.Current.GetInstance(Type.GetType(string.Format("{0}.{1}", EditorWorkerNamespace, attribute.EditorWorker)));
var attributeEditData = ((IEditorWorker)worker).LoadEditData();
if (TryUpdateModel(attributeEditData))
model.EditData.Add(attributeEditData); // model.EditData is a List<IEditData> that will be iterated on the Review page
reviewData.Add(attribute, attributeEditData);
}
}
return View(model);
}
// ReviewBatchViewModel.cs
public class ReviewBatchViewModel : BaseViewModel
{
public ReviewBatchViewModel() { EditData = new List<IEditData>(); }
public string SelectedAttributeIds { get; set; }
public List<ViewAttribute> SelectedAttributes { get; set; }
public List<IEditData> EditData { get; set; }
}
// IEditData.cs
public interface IEditData
{
}
// BroadcastStatusEditData.cs
public class BroadcastStatusEditData : IEditData
{
public int BroadcastStatus { get; set; }
}
Я полностью понимаю, что это действие контроллера неполно в его текущем состоянии. В настоящее время я работаю над попыткой получить эти объекты EditData, заполненные правильно, прежде чем двигаться дальше. Как уже упоминалось, любые мысли будут высоко оценены. Благодарю.
ОБНОВЛЕНИЕ: Что касается комментария @ mare, я должен был объяснить эту часть более четко, извините. Вызов TryUpdateModel фактически - это, возвращающий значение true, но поля объекта модели, передаваемые в него, фактически не заполняются из значений, которые были подтверждены в опубликованных данных формы. Объект модели, передаваемый в вызов, не является списком, его просто poco. Получаемый, в конечном счете, надежно заполненный модельный объект затем добавляется в коллекцию списка объектов модели, которая затем будет использоваться для отображения опубликованных данных для просмотра на странице обзора. Я вообще ничего не загружаю из хранилища данных. Уникальные редакторы для каждого выбранного атрибута визуализируются на экране «Редактирование», и я пытаюсь захватить значения редактирования для отображения на экране обзора перед отправкой партии изменений в службу. Надеюсь, это более понятно. Благодарю.
ОБНОВЛЕНИЕ 2: Я включил определение класса ReviewBatchViewModel
в соответствии с запросом @mare в комментариях. Использование ключевого слова var
в большинстве случаев в этом примере кода во многом связано с тем, что методы, которые заполняют эти переменные, будут возвращать объект другого типа для каждого выбранного атрибута, поэтому я никогда не знаю точно, что его (хотя он всегда будет реализовывать интерфейс, в этом случае либо IEditorWorker
, и/или IEditData
). В модели есть один класс «Атрибут». Представленный образец кода имеет три переменные относительно этого класса: 1) SelectedAttributeIds
представляет собой список идентификаторов атрибутов, которые пользователь выбрал для редактирования, разделенный запятыми, который передается с страницы редактирования на страницу обзора через скрытое поле, 2) selectedAttributes
- это коллекция фактических объектов атрибута, которые соответствуют тем идентификаторам, с которыми я могу работать, и 3) attributeEditData
- это экземпляр класса IEditData
, специфичный для каждого данного атрибута, который я пытаюсь связать опубликованные данные из Edit страница.
Надеюсь, эта дополнительная информация очищает даже больше.
TryUpdateModel() возвращает true, если выполнено успешно, и false, если это не так. Что вы имеете в виду, не работая? Означает ли это, что он возвращает ложь? Если это так, вы можете попробовать UpdateModel(), и поскольку это не возвращает true или false, скорее всего, это произойдет с исключением, и вы можете использовать данные этого исключения, чтобы выяснить, что не так. Я не думаю, что UpdateModel() и TryUpdateModel() будут работать со списком. Кроме того, я не понимаю, почему вы загружаете EditData из хранилища данных, а затем обновляете его из модели, а затем сохраняете эти обновленные данные обратно в модель. ? – mare
@mare - просмотрите мои обновления в ответ на ваш вопрос. Благодарю. –
Вы могли бы разместить соответствующие части класса ReviewBatchViewModel и attributeEditData (что бы это ни было, что, кстати, напоминает мне, что было бы легче понять, могли бы вы также явно объявить свои переменные вместо использования var)? Я думаю, что TryUpdateModel не работает, потому что ему не удается создать сопоставления между ReviewBatchViewModel и типом атрибутаEditData. – mare