C# IFeatureCollection已被释放。对象名称:';集合&x27;。从控制器转到视图
我对所有这些都是新手,而且我正处于制作这个web应用程序的早期阶段。这只是我个人用的。我试图在视图中显示web api调用的结果。api调用工作正常。我可以看到数据从服务返回,并被很好地放在数据传输中。它从服务发送到控制器,但我不确定为什么每次尝试将数据从控制器发送到视图时都会出现相同的异常: IFeatureCollection已被释放。对象名称:“集合” 谁能告诉我这是什么意思,我该如何解决这个问题 这是我的Startup.csC# IFeatureCollection已被释放。对象名称:';集合&x27;。从控制器转到视图,c#,.net-core-3.1,C#,.net Core 3.1,我对所有这些都是新手,而且我正处于制作这个web应用程序的早期阶段。这只是我个人用的。我试图在视图中显示web api调用的结果。api调用工作正常。我可以看到数据从服务返回,并被很好地放在数据传输中。它从服务发送到控制器,但我不确定为什么每次尝试将数据从控制器发送到视图时都会出现相同的异常: IFeatureCollection已被释放。对象名称:“集合” 谁能告诉我这是什么意思,我该如何解决这个问题 这是我的Startup.cs 公共启动(IConfiguration配置) { 配置=配置
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。使用此方法向容器中添加服务。
public void配置服务(IServiceCollection服务)
{
services.AddHttpClient(“mapQUrl”,client=>{client.BaseAddress=新Uri(“https://www.mapquestapi.com/geocoding/v1/address?"); });
services.AddHttpClient(“climaUrl”,client=>{client.BaseAddress=新Uri(“https://api.climacell.co/v3/weather/nowcast?"); });
services.AddControllersWithViews();
services.addScope();
}
//此方法由运行时调用。使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapControllerRoute(
名称:“默认”,
模式:“{controller=Home}/{action=Index}/{id?}”);
});
}
这是我的服务:
public异步任务GetTemp(MapQuestFlatDto loc)
{
List dataObjects=new List();
var client=_clientFactory.CreateClient(“climaUrl”);
字符串attr=“unit_system=us×tep=5&start_time=now&fields=temp&”;
var url=client.BaseAddress+attr+curlParameters;
//为JSON格式添加Accept标头。
client.DefaultRequestHeaders.Accept.Add(
新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=wait client.GetAsync(url);//阻塞调用!程序将在此处等待,直到收到响应或发生超时。
if(响应。IsSuccessStatusCode)
{
//解析响应体。
var strContent=await response.Content.ReadAsStringAsync();//确保添加对System.Net.Http.Formatting.dll的引用
dataObjects=JsonConvert.DeserializeObject(strContent);
返回数据对象;
}
其他的
{
Console.WriteLine(“{0}({1})”,(int)response.StatusCode,response.ReasonPhrase);
}
返回数据对象;
}
这是从服务接收数据并将其发送到视图的控制器方法:
@model IEnumerable<Weather_web_app.DTOs.ClimaCellDto>
@{
ViewData["Title"] = "ShowResults";
}
<h1>ShowResults</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.lat)
</th>
<th>
@Html.DisplayNameFor(model => model.lon)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.observation_time.value)
</td>
<td>
@Html.DisplayFor(modelItem => item.temp.value)
</td>
</tr>
}
</tbody>
</table>
[HttpPost]
公共异步void getLoc([FromBody]ZipDto obj)
{
var zip=Int32.Parse(obj.zip);
var位置=等待服务。GetLatLng(zip);
var climate=wait_services.GetTemp(位置);
展示结果(气候);
}
公共IActionResult显示结果(列表数据)
{
尝试
{
返回视图(数据);
}
捕获(例外情况除外)
{
掷骰子;
}
}
这是一种观点:
@model IEnumerable<Weather_web_app.DTOs.ClimaCellDto>
@{
ViewData["Title"] = "ShowResults";
}
<h1>ShowResults</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.lat)
</th>
<th>
@Html.DisplayNameFor(model => model.lon)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.observation_time.value)
</td>
<td>
@Html.DisplayFor(modelItem => item.temp.value)
</td>
</tr>
}
</tbody>
</table>
我已经在网上找了几个小时有类似问题的人,但我什么也没找到。非常感谢您的帮助。提前感谢。您似乎没有正确使用控制器方法。您需要从端点方法本身返回视图。目前,您仅从ShowResults方法返回,该方法没有被传播。试试这个(看看退货类型):
[HttpPost]
公共异步任务getLoc([FromBody]ZipDto obj)
{
var zip=Int32.Parse(obj.zip);
var位置=等待服务。GetLatLng(zip);
var climate=wait_services.GetTemp(位置);
返回显示结果(气候);
}
公共IActionResult显示结果(列表数据)
{
尝试
{
返回视图(数据);
}
捕获(例外情况除外)
{
掷骰子;
}
}
另外,我还建议重定向到GET方法,而不是直接从POST端点返回视图
[HttpPost]
public async Task<IActionResult> getLoc ([FromBody]ZipDto obj)
{
var zip = Int32.Parse(obj.zip);
var location = await _services.GetLatLng(zip);
var climate = await _services.GetTemp(location);
return ShowResults(climate);
}
public IActionResult ShowResults(List<ClimaCellDto> data)
{
try
{
return View(data);
}
catch (Exception ex)
{
throw ex;
}
}