Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>.Model.get 返回空值 - 如何解决这个问题?



我得到错误"系统NullReferenceException:"对象引用未设置为对象的实例。"微软AspNetCore。Mvc。剃须刀RazorPage。Model.get返回null">当试图从API获取数据,然后将其显示到web应用程序上时。

我觉得"视图和模型"或产品类都有问题,但我不确定如何解决,因为我觉得我已经尝试了很多东西。希望任何人都能帮忙-提前感谢

我在下面包含了一些代码:

产品:

public class Offer
{
public string currency { get; set; }
public double discount { get; set; }
public string ean { get; set; }
public DateTime endTime { get; set; }
public DateTime lastUpdate { get; set; }
public double newPrice { get; set; }
public double originalPrice { get; set; }
public double percentDiscount { get; set; }
public DateTime startTime { get; set; }
public int stock { get; set; }
public string stockUnit { get; set; }

}
public class Product
{
public string description { get; set; }
public string ean { get; set; }
public string image { get; set; }
}
public class Clearance
{
public Offer offer { get; set; }
public Product product { get; set; }
}
public class Address
{
public string city { get; set; }
public string country { get; set; }
public object extra { get; set; }
public string street { get; set; }
public string zip { get; set; }
}
public class Hour
{
public string date { get; set; }
public string type { get; set; }
public DateTime open { get; set; }
public DateTime close { get; set; }
public bool closed { get; set; }
public List<double> customerFlow { get; set; }
}
public class Store
{
public Address address { get; set; }
public string brand { get; set; }
public List<double> coordinates { get; set; }
public List<Hour> hours { get; set; }
public string name { get; set; }
public string id { get; set; }
public string type { get; set; }
}
public class Root
{
public List<Clearance> clearances { get; set; }
public List<Store> store { get; set; }
}

家庭控制器:

public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IHttpClientFactory _httpClientFactory;
public HomeController(ILogger<HomeController> logger, IHttpClientFactory httpClientFactory)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}
private async Task<Root> GetProducts()
{
var client = _httpClientFactory.CreateClient("API Client");
var result = await client.GetAsync("/?zip=9000"); 
if (result.IsSuccessStatusCode)
{
var content = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<Root>(content);
}
return null;
}
public async Task<IActionResult> Index()
{
var model = await GetProducts();
// Pass the data into the View
return View(model);
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

索引:

@{ViewData["Title"] = "Home Page";}
@{Layout = "~/Views/Shared/_Layout.cshtml";}
@model Madspild.Models.Root;
<div class="text-left">
@foreach (var item in Model.clearances)
{
<div>
<div> Offer: @item.offer</div>
<div> Product Description: @item.product.description</div>
</div>
}
</div>

启动.cs

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddControllersWithViews();
services.AddHealthChecks();
services.AddHttpClient("API Client", client =>
{
client.BaseAddress = new Uri("https://api.sallinggroup.com/v1/food-waste/"); /
client.DefaultRequestHeaders.Add("Authorization", "token");
client.DefaultRequestHeaders.Add("Accept", "application/json");
})

.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] {
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10)
}));
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});

}
}

由于命名的http客户端在net core中无法正常工作,您必须替换

services.AddHttpClient("API Client", client =>
{
client.BaseAddress = new Uri("https://api.sallinggroup.com/v1/food-waste/"); /
client.DefaultRequestHeaders.Add("Authorization", "token");
client.DefaultRequestHeaders.Add("Accept", "application/json");
})

带有

services.AddHttpClient();

你的行动

var client = _httpClientFactory.CreateClient();
//manually configure all urls and headers

您仍然可以使用类型化的httpclient,但通过旧的方法更可靠。

最新更新