#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>