如何在 asp.net mvc 5 中将数组从主视图传递到局部视图

How to pass an array from main view to partial view in asp.net mvc 5

我有一个主视图,其中包含一个从相应操作接收到的数组,它还包含下面的部分视图引用

Create.cshtml :

@model HrAndPayrollSystem.Models.EmployeeMasterA

@using (Html.BeginForm())
{
    ViewData["fs_lbls"] = ViewBag.FS_lbls as string[];
    @Html.Partial("~/Views/EmployeeMasterA/FinalSettlementTAB.cshtml", Model)
}

上面引用的部分视图定义如下

FinalSettlementTAB.cshtml :

@model HrAndPayrollSystem.Models.EmployeeMasterA

    @Html.DropDownList("DeptId", null, "Department")   

/* Print "ViewData["fs_lbls"]" array defined in the Main View `Create.cshtml` here */

我在 Create.cshtml 中定义了一个数组,现在,我想将它传递到局部视图 HR_EmployeeFinalSettlementTAB.cshtml 并打印它,正确的方法是什么?

我尝试过的:

我将 @Html.Partial() 行更改为以下内容:

 @Html.Partial("~/Views/EmployeeMasterA/FinalSettlementTAB.cshtml", null, new ViewDataDictionary { { "fs_lbls", ViewData["fs_lbls"] } })

并修改 FinalSettlementTAB.cshtml 文件如下:

@model HrAndPayrollSystem.Models.EmployeeMasterA

@Html.DropDownList("DeptId", null, "Department")   

@foreach (var i in ViewData["fs_lbls"] as string[])
{
    @i
}

但是它在第 @Html.DropDownList("DeptId", null, "Department") 行抛出异常 InvalidOperationException 说:

There is no ViewData item of type 'IEnumerable' that has the key 'DeptId'.

每当我尝试使用 ViewDataDictionary 将数组数据传递给局部视图时,它就会抛出上述异常,否则,当我不这样做时,它工作正常。

如何摆脱上述异常并将数组数据从主视图正确传递到局部视图?

我建议你在EmployeeMasterA中添加一个新的属性来存储标签,这样你就完全不需要使用ViewData了。

public class EmployeeMasterA
{
    public string[] fs_lbls { get; set; }

    public string SelectedLabel { get; set; }

    public List<SelectListItem> Labels
    {
        get
        {

            if (this.fs_lbls == null)
            {
                return Enumerable.Empty<SelectListItem>().ToList();
            }

            return (from label in fs_lbls
                   select new SelectListItem
            {
                Text = label,
                Value = label
            }).ToList();
        }
    }
}

Create.cshtml

@model WebApplication1.Controllers.EmployeeMasterA

@using (Html.BeginForm())
{
    @Html.Partial("FinalSettlementTAB", Model)
    <input type="submit" value="Save"/>
}

FinalSettlementTAB.cshtml

@model WebApplication1.Controllers.EmployeeMasterA

@Html.DropDownList("SelectedLabel", Model.Labels)

控制器

public ActionResult Create()
{
    var viewModel = new EmployeeMasterA();
    viewModel.fs_lbls = new[] {"Label1", "label 2"};

    return View(viewModel);
}

[HttpPost]
public ActionResult Create(EmployeeMasterA viewModel)
{
    return View();
}

您可以在返回 Create 视图之前,在控制器操作方法中设置 fs_lbls 的内容。当您 post 表单时, SelectedLabel 属性 将包含从下拉列表中选择的项目。显然,您需要更改 属性 名称以满足您的需要,但希望这会给您一个想法。