问题描述
我正在使用asp .net core 3,我通过javascript添加了多个部分
function AddBill(type)
{ tag = "....."; // some div and a tags
$.get('/Glasses/displayFarBill?index=' + farIndex,function (partial) {
$('#FarSightedBillsSection').append(tag);
$('#farSighted' + farIndex).append(partial);
$('#farSighted' + farIndex).collapse('show');
farIndex++;
});
}
我在父级上有多个ViewData
属性,已通过数据库上下文填充了控制器,如果我添加带有标签的partialview
,则局部变量会识别父级ViewData
,但是当我通过javascript添加它们时,但没有,我应该再次填写这些内容,并多次访问db。
public ActionResult displayFarBill(int index)
{
ViewData["Index"] = index;
//ViewData["LenseCover"] = new SelectList(_context.LenseCover,"Id","Name");
//ViewData["FrameBrand"] = new SelectList(_context.FrameBrand,"Name");
//ViewData["FrameModel"] = new SelectList(_context.FrameModel,"Name");
//ViewData["LenseBrand"] = new SelectList(_context.LenseBrand,"Name");
BillFarSighted billFarSighted = new BillFarSighted
{
PackFactor = 1,LenseCoverId = 2
};
return PartialView("BillFarSighted",billFarSighted);
}
如何将Parent ViewData发送给局部视图?
解决方法
我在已填写的父项上有多个ViewData属性 通过数据库上下文的控制器,如果我添加带有标签的partialview,partials 识别父ViewData,但是当我通过javascript添加它们时, 不用,我应该再次填写这些内容,并访问db multi 时间。
之所以可以使用partialview标记一次获取ViewData的原因是,partialview标记是在加载视图的同时执行的,并且只能加载一次。
但是当您使用ajax
获取部分视图时,程序将在此处输入另一个动作DisplayFarBill
, ,这将使以前存储的ViewData值消失。
如果您不想在DisplayFarBill
操作中再次获取数据,可以使用 TempData 进行存储。
应注意, TempData 存储模型需要序列化为json字符串以进行传输,并记住在局部视图中添加TempData.Keep()
以保留数据以备下次使用。 / p>
有关TempData和ViewData之间的具体区别,请参阅: TempData vs ViewData
以下是我使用TempData的示例:
public IActionResult Index()
{
var data= new SelectList(_context.LenseCover,"Id","Name");
TempData["LenseCover"] = JsonConvert.SerializeObject(data);
return View();
}
public ActionResult DisplayFarBill(int index)
{
ViewData["Index"] = index;
BillFarSighted billFarSighted = new BillFarSighted
{
PackFactor = 1,LenseCoverId = 2
};
return PartialView("BillFarSighted",billFarSighted);
}
BillFarSighted部分视图:
@using Newtonsoft.Json;
@model BillFarSighted
@Html.DropDownList("LenseCover",JsonConvert.DeserializeObject<List<SelectListItem>>(TempData["LenseCover"].ToString()).ToList())
@{TempData.Keep();}
这是测试结果: