ahmed_sa Ответов: 2

При отображении следующей записи в действии create я получаю ошибку nullreferenceexception: ссылка на объект не установлена на экземпляр объекта


Проблема

При отображении следующей записи EmployeeId я получаю ошибку в строке ниже :

<button id="BtnNext"onclick="location.href='@Url.Action("Next", "Employees",new {id=Model.EmployeeId })'" style="display:inline">Next</button>


NullReferenceException: ссылка на объект не установлена на экземпляр объекта.

ошибка линии нашли на вид создание действий создать контроллер сотрудников .

Подробности

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

На View Create я ставлю кнопку рядом,чтобы показать следующую строку EmployeeId,EmployeeName и т. д

но это показывает ошибку выше

Следующая кнопка она должна при нажатии на нее показывать следующую запись и связанные с ней данные если они существуют

используемая технология asp.net ядро 2.1 visual studio 2017 sql server 2012

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

Employee Controller Code

    public class EmployeesController : Controller
        {
            private readonly IEmployees _context;
    
            public EmployeesController(IEmployees context)
            {
                _context = context;
            }
            public IActionResult Create()
            {
               return View(model);
            }
           [HttpPost]
            public async Task<IActionResult> Create(Employee employee)
            {
            return View(employee);
            }
            public ActionResult Next(int id)
            {
                var nextID = _context.GetAll().OrderBy(i => i.EmployeeId)
                         .SkipWhile(i => i.EmployeeId != id)
                         .Skip(1)
                         .Select(i => i.EmployeeId);
                ViewBag.NextID = nextID;
             
                return View("Create");
            }
    
      

         <div class="row">
                <div class="col-md-4">
    <button id="BtnNext"onclick="location.href='@Url.Action("Next", "Employees",new {id=Model.EmployeeId })'" style="display:inline">Next</button>
                 <form asp-action="Create">
        
                    <div asp-validation-summary="ModelOnly" class="text-danger"> 
              </div>
                    <div class="form-group">
                        <label asp-for="EmployeeId" class="control-label"></label>
                        <input asp-for="EmployeeId" class="form-control" />
                        <span asp-validation-for="EmployeeId" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="BranchCode" class="control-label"></label>
                        <input asp-for="BranchCode" class="form-control" />
                        <span asp-validation-for="BranchCode" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="EmployeeName" class="control-label"></label>
                        <input asp-for="EmployeeName" class="form-control" />
                        <span asp-validation-for="EmployeeName" class="text-danger"></span>
                    </div>
                    
                    <div class="form-group">
                        <input type="submit" value="Create" class="btn btn-default" />
                    </div>
                </form>
            </div>
        </div>

Arkadeep De

Откуда вы получаете эту модель.Кодсотрудника??
И установите нулевую проверку на nextID, прежде чем назначить его viewbag.

ahmed_sa

так что как решить проблему вы можете мне сказать

2 Ответов

Рейтинг:
1

OriginalGriff

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

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

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

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

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


ahmed_sa

это полный код для моего сотрудника контроллера
это все мой код
использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование системы.Нарезание резьбы.Задачи;
использование Microsoft.AspNetCore.В MVC;
использование Microsoft.AspNetCore.Mvc.Rendering;
использование Microsoft.EntityFrameworkCore;
используя вкладки.Сведения;
используя вкладки.Данных.ДТО;
использование TAB.Service;


пространство имен TAB.Web.Controllers
{
публичный класс EmployeesController : контроллер
{
частная IEmployees только для чтения _context;

public EmployeesController(контекст IEmployees)
{
_context = контекст;
}





// Вам: человек/создать
общественные IActionResult создать()
{
var model = новый сотрудник();
модель.Кодсотрудника = _context.Способность().Макс(сотрудник =&ГТ; работник.EmployeeId) + 1;




обратный вид(модель);

}
public ActionResult Next(int id)
{
ВАР кнопкуnextid = _context.GetAll().OrderBy(i => i.EmployeeId)
.SkipWhile(i => i.EmployeeId != id)
.Пропустить(1)
.Select(i => i.EmployeeId);


Видовой мешок.Кнопкуnextid = кнопкуnextid;

return View("создать");
}

[HttpPost]
[ValidateAntiForgeryToken]
публичная асинхронная задача<iactionresult> Create(Employee employee)
{
if (ModelState.Функция IsValid)
{

если (сотрудник.EmployeeId <= 0)
{
ждите _context.InsertAsync(сотрудник);
}

еще
{
await _context.UpdateAsync(сотрудник);
}

return RedirectToAction("индекс");
}

вид возврата(сотрудник);

}


}
}

OriginalGriff

Это не имеет значения - мы все еще не можем запустить его в тех же условиях, что и Вы, поскольку у нас нет доступа к вашим данным.

Серьезно, возьмите отладчик и посмотрите, что вы можете найти!

ahmed_sa

кнопкуnextid переменной, когда поставил точку останова в нем имеют значение null

OriginalGriff

Так что теперь выясните, почему.
Что означает способность возвращать?
Что остается после скипа?
И так далее.

Мы не можем сделать это для вас!

ahmed_sa

и id =2

Рейтинг:
0

Patrice T

100+ вопросов и подсчет голосов!
Доставка кода без ошибок-это часть вашей работы, возможно, пришло время научиться самостоятельно выслеживать ошибки.
Сообщение об ошибке является результатом уникальной комбинации вашего кода, конфигурации SQL server, базы данных ... этого никто не может воспроизвести. Вы единственный, кто может найти проблему и исправить ее.

Цитата:
NullReferenceException: ссылка на объект не установлена на экземпляр объекта.

Все, что мы можем сказать, это то, что где-то операция, возвращающая объект, терпит неудачу, и сообщение об ошибке появляется, когда вы пытаетесь использовать этот неудачный ответ.
Используйте отладчик, чтобы увидеть, что на самом деле делает ваш код.
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.