Создание свойств ViewBag на основе строк

#asp.net-mvc-3 #viewbag

#asp.net-mvc-3 #viewbag

Вопрос:

Есть ли какой-либо способ создать и использовать динамические свойства для ViewBag на основе строк?

Что-то вроде

 ViewBag.CreateProperty("MyProperty");
ViewBag.Property("MyProperty") = "Myvalue";
 

Спасибо

Ответ №1:

Я только что узнал, что ViewData можно использовать для создания таких свойств для ViewBag

Итак, чтобы создать свойство CityErrorMessage, я должен использовать

 ViewData.Add("CityErrorMessage", MyErrorMessage)
 

и затем в представлении я могу использовать

 @ViewBag.CityErrorMessage
 

Редактировать:

Я создал свойства ViewBag динамически, потому что я получил имя поля с ошибкой проверки в списке

Итак, код на самом деле

 foreach (ValidationError err in ValidationErrors)
{
    ViewData.Add(
        string.format("{0}ErrorMsg", err.PropertyName),
        err.ValidationErrorMessage);
}
 

Комментарии:

1. Спасибо! Это заняло много времени, чтобы найти.

2. благодарим вас за объяснение взаимосвязи между ViewBag и ViewData

3. Следует отметить, что вы можете использовать ViewData["NameHere"] для динамического получения значения сохраненных вами элементов.

Ответ №2:

Обновление: я с опозданием понял, что этот код взят из проекта Nancy, и Nancy реализует свой собственный ViewBag, поэтому этот код не работает.Чистый MVC3 и не отвечает на вопрос. Однако можно утверждать, что вопрос можно решить, переключившись на Nancy.

Я обнаружил, что ViewBag имеет Add метод, поэтому вы можете сделать это:

 foreach(var row in model)
            {
                ViewBag.Add(row.resourceName, row.content);
            }
 

Комментарии:

1. Выдано исключение: ‘Microsoft. CSharp.RuntimeBinder. Исключение RuntimeBinderException’ в Microsoft. CSharp.dll Дополнительная информация: «Система. Динамический. DynamicObject’не содержит определения для ‘Add’

2. Я проверю, работает ли у меня проект с этим кодом. Кажется, другие не могут его воспроизвести.

3. Ошибка: исключение типа ‘Microsoft. CSharp.RuntimeBinder. Исключение RuntimeBinderException’ произошло в System.Core.dll но не был обработан в пользовательском коде