如何在 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
属性 将包含从下拉列表中选择的项目。显然,您需要更改 属性 名称以满足您的需要,但希望这会给您一个想法。
我有一个主视图,其中包含一个从相应操作接收到的数组,它还包含下面的部分视图引用
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
属性 将包含从下拉列表中选择的项目。显然,您需要更改 属性 名称以满足您的需要,但希望这会给您一个想法。