将父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属性,已通过数据库上下文填充了控制器,如果我添加带有标签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();}

这是测试结果:

enter image description here