我想在从 web api 控制器操作中获取数据后渲染部分视图。我想做以下操作:
- 需要使用 jquery 的 post 方法从 web api 控制器获取数据。
从 web api 获取数据后,需要导航到具有局部视图(用于渲染图表元素)的主视图(例如:“diplay”)。此外,将模型数据传递给局部视图使用 jqplot 绘制图表。
源代码:
查询:
$("#show").click(function (e) { e.preventDefault(); var jsondata = $("#filtercontent").text(); var jlist; $.ajax({ type: "POST", url: '/api/CreateReports/', data: "=" + jsondata, success: function (json) { jlst = $.toJSON(json); } }); $.post("/reports/display", { Data: jlst }, function (data, textStatus) { htmldatafordisplay = data; if (textStatus != "success") { result = "false"; alert("Error"); } window.location.replace("display"); });
控制器动作:
[HttpPost] public ActionResult Display(string jsonData) { var mdata = new DataModel(); List<DataModel> personData; JavaScriptSerializer jss = new JavaScriptSerializer(); personData = jss.Deserialize<List<DataModel>>(jsonData); return View("display",personData); }
Web ApiContorller 操作:
[HttpPost] public IEnumerable<ReportData> Post([FromBody]string value) { var data = value.ToString(); var model = new ReportData(); string query = "select id, name ,value from table"; var objdata = GetResult(query).ToList(); return objdata; }
数据模型:
public class Report { public int Id { get; set; } public string Name { get; set; } public int Value{ get; set; } }
显示.cshtml:
@model List<JobInsight.Web.Models.DataModel> <div>Welcome to our sitet</div> <div>@{Html.RenderPartial("Chart", @Model);}</div>
图表.cshtml:
<div id="chart" class="jqplot-target barChart"> </div> <script> var json = Json.Encode(Model); var dataSlices = []; var ticks = []; $.each(json, function (entryindex, entry) { dataSlices.push(entry['Value']); ticks.push(entry['Name']); }); var plot1 = $.jqplot('chart', [dataSlices], { seriesDefaults: { renderer: $.jqplot.BarRenderer, rendererOptions: { barWidth: null, fillToZero: true, barDirection: 'horizontal' }, pointLabels: { show: true, location: 'e' } }, legend: { show: false }, axes: { xaxis: { pad: 0, tickOptions: { formatString: "%'d" } }, yaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks, tickOptions: { showGridline: false }, } }, noDataIndicator: true }); </script>