asp.net-core - 将父 ViewData 发送到在 javascript 中呈现的 Partial
问题描述
我正在使用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
在 parent 上有多个属性,通过 db context 填充了控制器,如果我添加partialview
标签,partials 识别 parent ViewData
,但是当我通过 javascript 添加它们时,它们没有,我应该再次填写它们并访问 db multi次。
public ActionResult DisplayFarBill(int index)
{
ViewData["Index"] = index;
//ViewData["LenseCover"] = new SelectList(_context.LenseCover, "Id", "Name");
//ViewData["FrameBrand"] = new SelectList(_context.FrameBrand, "Id", "Name");
//ViewData["FrameModel"] = new SelectList(_context.FrameModel, "Id", "Name");
//ViewData["LenseBrand"] = new SelectList(_context.LenseBrand, "Id", "Name");
BillFarSighted billFarSighted = new BillFarSighted
{
PackFactor = 1,
LenseCoverId = 2
};
return PartialView("BillFarSighted", billFarSighted);
}
如何将父 ViewData 发送到部分?
解决方案
我在通过数据库上下文填充控制器的父级上有多个 ViewData 属性,如果我添加带有标签的部分视图,部分会识别父级 ViewData,但是当我通过 javascript 添加它们时,它们不会,我应该再次填写它们并访问到分贝多次。
之所以可以使用partialview标签一次性获取ViewData,是因为partialview标签是在视图加载的同时进行的,而且只加载一次。
但是当你使用ajax
获取partialview时,程序会在此处输入另一个动作是DisplayFarBill
,这将使之前存储的ViewData值消失。
如果不想在DisplayFarBill
action 中再次获取数据,可以使用TempData来存储。
需要注意的是,TempData存储模型需要序列化成json字符串进行传输,记得TempData.Keep()
在partial view中添加保存数据以备下次使用。
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();}
这是测试结果:
推荐阅读
- java - 使用 Redis 的分布式锁 (Redisson):锁定如何跨服务器实例工作?
- ruby-on-rails - Rails网站登录在生产中不起作用(Heroku)
- c++ - 如何为对象提供不同的接口(最佳)
- git - 为什么 .git 目录在不同的 GIT_DIR 中!分支?
- sql - 比较两个 select 语句的结果
- android - 使用库 (https://github.com/OmarAflak/Bluetooth-Library) 制作的蓝牙应用程序崩溃
- c - 如何在for循环中输入if语句?
- c# - 如何在不暴露明文的情况下通过网络传输 SecureString(或类似内容)?
- expression - 使用通用表达式语言 (CEL) 在列表中查找值的示例
- python - 将 Python 代码与 MySQL 连接时出现回溯错误