将json返回到Core 2中的部分视图

时间:2018-07-19 15:43:42

标签: c# asp.net json asp.net-mvc asp.net-core-2.0

我想创建一个包含其他视图的视图。我以前从未使用过json。我该怎么办?如何在视图中格式化json数据?

我的第一个功能“ Details”是从数据库中检索对象并返回视图“ Details.cshtml”。我要在此视图中生成局部视图(“ Stats.cshtml”)。现在,我想使用Stats函数中的json格式下载的数据生成局部视图。

控制器

public IActionResult Details(int? id = 1)
{
  var person = _context.Persons.Find(id);

  return View(champion);
}

public IActionResult Stats()
{
  var json = new WebClient().DownloadString("url");

  return Json(s);
}

查看-Details.cshtml

@model Person

<div class=row">
  <div class="col-sm-5"> @Model.Name </div>
  <div class="col-sm-5"> @Html.Partial("Stats") </div>
</div>

查看-Stats.cshtml

<h2>Stats</h2>
<div> here I want to put in a json field </div>

当我从地址 localhost / Home / Stats 运行“ Stats”功能时,我在json中得到结果,但是当我运行“ Details”功能时,我得到了视图没有json值的“详细信息”和“统计信息”。

1 个答案:

答案 0 :(得分:0)

要渲染部分图片,您可以通过代码选择许多方法

  1. 最简单的方法是:将统计信息代码移至“详细信息”操作

    public ActionResult Details()
    {
        ...//prepare your person viewModel
    
        var result = new WebClient().DownloadString("url");
        var stats = JsonConvert.DeserializeObject<YourViewModel>(result);
    
        //you have 2 options to return data
        yourPersonModel.Stats=stats ; //<== you have to change PersonViewModel
        //or ViewBag.Stats=stats; 
    
        return View(yourPersonModel);
    }
    

然后在Details.cshtml中:

@Html.Partial("Stats", ViewBag.Stats or Model.Stats)//by your choice before.
  1. 由于删除了Html.Action,但是ViewComponent出现在Core中,您现在不能直接调用它,但是此链接将告诉您如何还原它:@Html.Action in Asp.Net Core

    public ActionResult Stats()
    {
        var result = new WebClient().DownloadString("url");
        var yourViewModel = JsonConvert.DeserializeObject<YourViewModel>(result);
        return PartialView(yourViewModel);
    }
    

在您的视图中添加以下代码-Stats.cshtml:

@model YourViewModel

然后在Details.cshtml中:

@Html.Action("Stats")

请注意, Html.Action无法调用async操作,请小心使用。

  1. 下一个解决方案是使用新功能ViewComponent,这是详细信息: https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.1

  2. 最后一个不是您所期望的:使用AJAX在页面上加载此部分页面,详细信息已加载到客户端