首页 > 解决方案 > 将父 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 发送到部分?

标签: asp.net-coreasp.net-mvc-partialview

解决方案


我在通过数据库上下文填充控制器的父级上有多个 ViewData 属性,如果我添加带有标签的部分视图,部分会识别父级 ViewData,但是当我通过 javascript 添加它们时,它们不会,我应该再次填写它们并访问到分贝多次。

之所以可以使用partialview标签一次性获取ViewData,是因为partialview标签是在视图加载的同时进行的,而且只加载一次。

但是当你使用ajax获取partialview时,程序会在此处输入另一个动作是DisplayFarBill这将使之前存储的ViewData值消失。

如果不想在DisplayFarBillaction 中再次获取数据,可以使用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();}

这是测试结果:

在此处输入图像描述


推荐阅读