Проверка, чтобы увидеть, имеет ли свойство 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
}
Однако я получаю эту ошибку:
Невозможно выполнить привязку во время выполнения нулевой ссылки
Любая идея?
Ответы
Ответ 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")) {...}