Подтвердить что ты не робот

Проверка, чтобы увидеть, имеет ли свойство ViewBag свойство или нет, для условного ввода JavaScript

Рассмотрим этот простой контроллер:

Porduct product = new Product(){
  // Creating a product object;
};
try
{
   productManager.SaveProduct(product);
   return RedirectToAction("List");
}
catch (Exception ex)
{
   ViewBag.ErrorMessage = ex.Message;
   return View("Create", product);
}

Теперь, в моем представлении Create, я хочу проверить объект ViewBag, чтобы узнать, имеет ли он свойство Error или нет. Если у него есть свойство error, мне нужно добавить некоторый JavaScript на страницу, чтобы показать сообщение об ошибке моему пользователю.

Я создал метод расширения, чтобы проверить это:

public static bool Has (this object obj, string propertyName) 
{
    Type type = obj.GetType();
    return type.GetProperty(propertyName) != null;
}

Затем в представлении Create я написал эту строку кода:

@if (ViewBag.Has("Error"))
{
    // Injecting JavaScript here
}

Однако я получаю эту ошибку:

Невозможно выполнить привязку во время выполнения нулевой ссылки

Любая идея?

4b9b3361

Ответ 1

Ваш код не работает, потому что ViewBag является динамическим объектом, а не "реальным" типом.

должен работать следующий код:

public static bool Has (this object obj, string propertyName) 
{
    var dynamic = obj as DynamicObject;
    if(dynamic == null) return false;
    return dynamic.GetDynamicMemberNames().Contains(propertyName);
}

Ответ 2

@if (ViewBag.Error!=null)
{
    // Injecting JavaScript here
}

Ответ 3

Вместо использования ViewBag используйте ViewData, чтобы вы могли проверять предмет, который вы храните. Объект ViewData используется в качестве словаря объектов, к которым вы можете ссылаться по ключу, он не является динамическим, как ViewBag.

// Set the [ViewData][1] in the controller
ViewData["hideSearchForm"] = true;    

// Use the condition in the view
if(Convert.ToBoolean(ViewData["hideSearchForm"])
    hideSearchForm();

Ответ 4

Я бы полностью избежал ViewBag здесь. Смотрите мои мысли здесь: http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

Альтернативой будет бросить пользовательскую ошибку и поймать ее. откуда вы знаете, если база данных не работает, или если ошибка бизнес-логики сохраняет ошибку? в приведенном выше примере вы просто поймаете единственное исключение, как правило, есть лучший способ поймать каждый тип исключения, а затем общий обработчик исключений для действительно необработанных исключений, таких как встроенные страницы пользовательских ошибок или использование ELMAH.

Итак, я бы предпочел ModelState.AddModelError() Затем вы можете посмотреть на эти ошибки (предположив, что вы arent jsut собираетесь использовать встроенную проверку) через Как получить доступ к ModelState из моего представления (aspx-страница)?

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

Ответ 5

Вы можете использовать ViewData.ContainsKey("yourkey").

В контроллере:

ViewBag.IsExist = true;

В поле зрения:

if(ViewData.ContainsKey("IsExist")) {...}