Не удается передать данные в слой представления в asp.net : Исключение NullReferenceException: ссылка на объект не установлена для экземпляра объекта

#asp.net-core

#asp.net-core

Вопрос:

Я новичок в asp.net и пытаюсь создать простой проект, но на первых шагах у меня есть проблема: у меня есть NullReferenceException: Object reference not set to an instance of an object. в view слое.

Пакеты в решении:

введите описание изображения здесь

  • Startup.cs:
       public void ConfigureServices(IServiceCollection services)
      {
          services.AddControllersWithViews();
          services.AddMvc();
          services.AddTransient<ICars, MockCars>();
          services.AddTransient<ICategories, MockCategories>();
          services.AddMvc(option => option.EnableEndpointRouting = false);
      }
    
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
          app.UseDeveloperExceptionPage();
          app.UseStatusCodePages();
          app.UseStaticFiles();
          app.UseMvcWithDefaultRoute();
      }
     
  • Контроллер:
     public ViewResult List()
      {
          IEnumerable<Car> result = _cars.Cars; //not null - checked
          return View(result);
      }
     
  • Вид:
     @page
    @using Shop.Models
    @model IEnumerable<Car>
    
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <div>
        <h2>All cars</h2>
        @{
            foreach (var car in Model)//    <----    NullReferenceException 
            {
                <div>
                    <h2>Model: @car.name. @car.shortDescriotion</h2>
                    <p>Price: @car.price.ToString("c")</p>
                </div>
            }
        }
    </div>
    </body>
    </html>
 
  • Исключение:
     > NullReferenceException: Object reference not set to an instance of an
    > object. AspNetCore.Views_Cars_List.get_Model()
    > AspNetCore.Views_Cars_List.<ExecuteAsync>b__8_1() in List.cshtml
    >  
    >         foreach (var car in Model) Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()
    > AspNetCore.Views_Cars_List.ExecuteAsync() in List.cshtml
    >  
    >     Layout = null; Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage
    > page, ViewContext context)
    > Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage
    > page, ViewContext context, bool invokeViewStarts)
    > Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext
    > context)
    > Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext
    > viewContext, string contentType, Nullable<int> statusCode)
    > Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext
    > viewContext, string contentType, Nullable<int> statusCode)
    > Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext
    > actionContext, IView view, ViewDataDictionary viewData,
    > ITempDataDictionary tempData, string contentType, Nullable<int>
    > statusCode)
    > Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext
    > context, ViewResult result)
    > Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext
    > context)
    > Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0<TFilter,
    > TFilterAsync>(ResourceInvoker invoker, Task lastTask, State next,
    > Scope scope, object state, bool isCompleted)
    > Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed
    > context)
 

Видеоурок, которому я следовал, работает хорошо, но не в моем случае. Где я мог ошибаться?

Ответ №1:

Когда вы используете @page директиву, вы сообщаете, что это представление является представлением страницы Razor.

@page превращает файл в действие MVC, что означает, что он обрабатывает запросы напрямую, не проходя через контроллер

Microsoft Docs: Введение в Razor Pages в ASP.NET Основные / Страницы Razor

Но вы, вероятно, захотите использовать ASP.NET Основной вид MVC:

В ASP.NET Core MVC View — это HTML-шаблон со встроенной разметкой Razor.

Документы Microsoft: Просмотр в ASP.NET Ядро MVC


Итак, исправление должно быть простым. Удалите @page директиву из вашего представления, и она должна сработать.

 @using Shop.Models
@model IEnumerable<Car>
    
@{
    Layout = null;
}
    
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<div>
    <h2>All cars</h2>
    @{
        foreach (var car in Model)
        {
            <div>
                <h2>Model: @car.name. @car.shortDescriotion</h2>
                <p>Price: @car.price.ToString("c")</p>
            </div>
        }
    }
</div>
</body>
</html>