ASP.NET MVC ViewData Null - PullRequest
       12

ASP.NET MVC ViewData Null

5 голосов
/ 21 января 2009

В настоящее время я создаю сайт электронной коммерции с использованием C # ASP.NET MVC и только что столкнулся с проблемой. На таких страницах, как страницы продукта и страницы результатов поиска, я должен передавать списки данных с моего контроллера на ViewPage, и это прекрасно работает. Однако исключение нулевой ссылки возникает, если Viewdata равно нулю. Это происходит внутри страницы просмотра, когда она просматривает данные ViewData и отображает продукты или отзывы.

// ProductController.cs

public ActionResult Products_Sub(string category, int page)
{
ViewData["Products"] = database.GetByCategory(category, page);
return View();
}

// ViewPage.cs - цикл продукта

 <ul> foreach (E_Store.Models.Product product in ViewData["Products"] as  
 List<e_store.models.product>)
 {%> 
 <li>
 <img alt="<%= product.Title%>" src="<%= product.Thumbnail %>" /> 
 <a href="/<%=product.Category %>/<%= product.SubCategory %>/<%= product.ASIN %>/1">
 <%=product.Title%></a>
 </li>
 }%>
 </ul>    

Исключение Null Reference возникает, когда достигается следующий фрагмент кода:

  <ul> foreach (E_Store.Models.Product product in ViewData["Products"] as

То, что я хотел бы знать, - это лучший способ отследить этот тип ошибки, если она действительно произошла, не прибегая к операторам if, проверяющим, является ли она нулевой.

Если кто-нибудь знает хороший способ сделать это, я бы очень хотел знать.

Ответы [ 2 ]

7 голосов
/ 21 января 2009

В вашем случае я хотел бы, чтобы ваш метод database.GetByCategory (category, page) просто возвращал пустой список, а не null, таким образом, в вашем выражении foreach просто не будет данных для прохождения, но вы не получите нулевое исключение.

В случае, если вы не имеете дело со списком, а элемент пуст, мы используем

Html.Encode(ViewData.Eval("Field"))

Чтобы получить значение HTML элемента, он вернет "", если элемент нулевой.

2 голосов
/ 21 января 2009

вы всегда можете использовать встроенный нулевой оператор объединения следующим образом:

<%= product.Title ?? "" %>

.. но вы просто получите теги с пустыми атрибутами. не то, что вы хотите.

вам нужно будет использовать ifs где-нибудь. проблема требует этого. но вопрос в том, «где их можно положить, не запутав?»

Со мной все в порядке, если я заверну все это, если. если нет, возможно, попробуйте метод расширения Html для каждого элемента вашего цикла. передать объект модели ViewData и, возможно, условие bool для проверки на eval. Я перегружаю Html.Encode () в Html.IfEncode (условие, stringIfTrue, stringIfFalse), вы можете попробовать что-то подобное, но для всего изображения и группы привязки. иначе, возможно, создайте группу в коде для этого представления и просто используйте

<% =GetImageAndLinkHtml() %>

.. например.

дайте мне знать, если вам нужна дополнительная информация

...