Member 12132704 Ответов: 4

@Foreach в представлении ссылка на объект модели не установлена на экземпляр объекта


Hi I'm getting a scary problem The controller is invoked normally, the foreach loop works fine, call the view with a List return and the @foreach start the loop and load the registers brought from the DB, but in the last interaction it brokes.


Server Error in Application '/'. Object reference not set to an instance of an object.enter image description here Exception Details: System.NullReferenceException: Object reference not defined for an instance of an object.


---> просмотр









@model IEnumerable<VitrineVirtual.Model.Carrinho_Compras>



<div class="ibox-content">
	<table class="footable table table-stripped toggle-arrow-tiny" data-page-size="15">
		<tbody>
			@foreach (var item in Model.Where(item => item != null))
			{
				<tr>
					<td>
						<div class="product-detail">
							<ul>
								<li><span>@Html.DisplayFor(modelItem => item.Nome_Produto)</span></li>
								<li><span>@Html.DisplayFor(modelItem => item.Modelo_Produto)</span></li>
								<li><span>@Html.DisplayFor(modelItem => item.Descricao_Produto)</span></li>
							</ul>
						</div>
					</td>


Что я уже пробовал:

I tried to do with viewdata, viewbag, IEnumerable, List, IList every possibilities but nothing. Is somebody have any spirit and glourious solution? Thanks a lot. The variable names it´s in portuguese, but I keeped the main names like dbcontext in ingles or the standar initials.

4 Ответов

Рейтинг:
32

jimmson

Вам нужно отладить свой код и выяснить, какое свойство имеет значение NULL. Это то, что никто не может сделать для вас, так как у нас нет никакого доступа к вашим данным. Под последним "взаимодействием" я предполагаю, что вы имели в виду итерацию - так что я подозреваю, что последний пункт в Model есть какое-то свойство имеет значение null, а вы пытаетесь использовать его. Я думаю, что это действительно может произойти в той части кода, которую вы еще не опубликовали.

Кроме того, брошенное исключение должно иметь трассировку стека, которая сообщает вам, в какой строке происходит ошибка.


Member 12132704

jimmson, десятичной свойства были проблемы, я заявляю, как класс, допускающий значение null в модели так, допускающие значения null<десятичной> и установить некоторые свойства, как MadMyche предлагаю и работает отлично.

Рейтинг:
13

MadMyche

Здесь есть пара возможностей
1. The Модель в это НУЛЕВОЙ
2. Одно из свойств модели.Пункт есть НУЛЕВОЙ

В первом случае я специально проверяю, что происходит до Я пытаюсь повторить его

@if (Model != null) {
   foreach (var item in Model.Where(item => item != null)) {
Для второго сценария вы можете использовать Нулевое слияние и условные обозначения при вызове конкретного свойства
Операторы доступа к членам - Справочник по C# | Microsoft Docs[^]
Выражения - спецификация языка C# | Microsoft Docs[^]

Я справляюсь с этим с помощью статического класса для методов расширения, который имеет подпрограммы для всех типов данных, которые я использую
using System {
   public static partial class PublicExtensions {
      public static string ForcedString(this object NullableObject, string DefaultValue = "") {
         return (NullableObject == null ? DefaultValue : NullableObject.ToString().Trim());
      }
А для вашего сценария это будет выглядеть примерно так
<span>@Html.DisplayFor(modelItem => item.Nome_Produto.ForcedString())</span>


Member 12132704

MadMyche ваш snnipet код прекрасно работает для меня
Проблема была решена я взял задания:
Сначала я включаю статический класс с именем ForcedString для обработки свойств, допускающих значение null.
Во - вторых, я установил в класс Nullable все десятичные атрибуты в этой модели и foreach interate yill последний и вызываю представление нормально.
Спасибо за все сладости.

MadMyche

Пожалуйста

Рейтинг:
1

OriginalGriff

Нет "одного решения" - это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!


Рейтинг:
1

Member 12132704

Вероятно, что это должно быть свойство, заданное как null, почему модель точно не null, я проверил отладку и список<> имеет данные.

Я использую десятичные свойства, и они не объявлены Nullable, это может быть проблемой?

В контроллере а сделайте вот так:

var items = db.CarrinhoCompras.Where(x => x.ID_Usuario == idUsuario).ToList();
if (items != null)
{
ViewData["Qtd_Items"] = items.Count;
ViewData["Package"] = items;
decimal total = 0;
total = items.Select(x => x.Price).Sum();
ViewData["Total"] = total;
ViewData["Total_Order"] = 1;
}

return View(items);


в виду

<tbody>
                        @foreach (var item in Model.Where(item => item != null))
                        {
                            <tr>
                                <td width="120">
                                    <div class="cart-product-imitation">
                                        <a href="#" title="Foto">
                                            <img style="position:initial" width="90" height="90" src="@Url.Content(item.Caminho_Arquivo.ForcedString())" />
                                        </a>
                                    </div>
                                </td>
                                <td>
                                    <div class="product-detail">
                                        <ul>
                                            <li><span>@Html.DisplayFor(modelItem => item.Nome_Produto)</span></li>
                                            <li><span>@Html.DisplayFor(modelItem => item.Modelo_Produto)</span></li>
                                            <li><span>@Html.DisplayFor(modelItem => item.Descricao_Produto)</span></li>
                                        </ul>
                                    </div>
                                </td>
                                <td>
                                    <div class="product-price">
                                        @Html.DisplayFor(modelItem => item.Preco_Produto)
                                        <input type="text" id="txtAtualizaPreco" name="preco" class="form-control">
                                        <input type="hidden" name="preco" id="hdnAtualizaPreco" value="@item.Preco_Produto.ForcedString()" />
                                    </div>
                                </td>
                                <td width="40">
                                    <div class="btn-group">
                                        <button id="btnExcuiItemcarrinho" class="btn-danger btn btn-xs apaga" value="Excuir"></button>
                                        <input type="hidden" name="itemCarrinho" id="hdnExcluiItemCarrinho" value="@item.ID_Carrinho_Compras.ForcedString()" />
                                    </div>
                                </td>
                            </tr>
                            <tr>
                                <td class="hidden-phone bg-dark">
                                    <input type="button" id="btnAtualizaPreco" value="Calcular" class="form-control text-white" style="background-color: #3872a2">
                                </td>
                            </tr>
                        }
                    </tbody>