Asp.net mvc ASP MVC3-将集合项传递到部分视图

Asp.net mvc ASP MVC3-将集合项传递到部分视图,asp.net-mvc,asp.net-mvc-3,list,asp.net-mvc-2,partial-views,Asp.net Mvc,Asp.net Mvc 3,List,Asp.net Mvc 2,Partial Views,我有一个视图模型,它是用一个单独模型的集合(一个列表)创建的。在我们的数据库中,我们有两个表:BankListMaster和BankListAgentId。“主”表的主键用作代理Id表的外键 由于主/代理ID表具有一对多关系,因此我创建的视图模型包含一个List对象BankListAgentId。在我们的编辑页面上,我希望能够显示与特定银行相关联的任何和所有代理ID,并让用户能够添加或删除它们 我目前正在写一篇关于编辑可变长度列表的博文。但是,当从数据库中提取现有项时,它似乎没有涵盖这个特定场景

我有一个视图模型,它是用一个单独模型的集合(一个
列表
)创建的。在我们的数据库中,我们有两个表:
BankListMaster
BankListAgentId
。“主”表的主键用作代理Id表的外键

由于主/代理ID表具有一对多关系,因此我创建的视图模型包含一个
List
对象
BankListAgentId
。在我们的编辑页面上,我希望能够显示与特定银行相关联的任何和所有代理ID,并让用户能够添加或删除它们

我目前正在写一篇关于编辑可变长度列表的博文。但是,当从数据库中提取现有项时,它似乎没有涵盖这个特定场景

我的问题是,您能否将特定的集合项传递给部分视图,如果是,您将如何将其正确编码到部分视图中?下面的代码说明:

当前上下文中不存在名称“item”

但是,我也尝试过在局部视图中使用带有索引和以下语法的常规
for
循环:

model=>model.Fixed[i].AgentId

但这只是告诉我当前上下文中不存在名称
i
。视图将不会使用这两种方法进行渲染

下面是视图中的代码

@model Monet.ViewModel.BankListViewModel
@using (Html.BeginForm())
{
    <fieldset>
        <legend>Stat(s) Fixed</legend>
        <table>
        <th>State Code</th>
        <th>Agent ID</th>
        <th></th>
            @foreach(var item in Model.Fixed)
            {
                @Html.Partial("FixedPartialView", item)       
            }
        </table>
    </fieldset>
}
@model Monet.ViewModel.BankListViewModel
@使用(Html.BeginForm())
{
统计数据已修复
州代码
代理ID
@foreach(模型中的var项。已修复)
{
@Html.Partial(“FixedPartialView”,项目)
}
}
这是局部视图

@model Monet.ViewModel.BankListViewModel

<td>
    @Html.DropDownListFor(item.StateCode,
        (SelectList)ViewBag.StateCodeList, item.StateCode)
</td>
<td>
    @Html.EditorFor(item.AgentId)
    @Html.ValidationMessageFor(model => model.Fixed[i].AgentId)
    <br />
    <a href="#" onclick="$(this).parent().remove();" style="float:right;">Delete</a>
</td>
@model Monet.ViewModel.BankListViewModel
@Html.DropDownListFor(item.StateCode,
(选择列表)ViewBag.StateCodeList,item.StateCode)
@Html.EditorFor(item.AgentId)
@Html.ValidationMessageFor(model=>model.Fixed[i].AgentId)

这是视图模型。它目前已将固定/可变代理Id列表初始化为10,但这只是启动并运行此页面的一个变通方法。最终的希望是允许列表根据需要大小而定

public class BankListViewModel
{
    public int ID { get; set; }
    public string BankName { get; set; }
    public string LastChangeOperator { get; set; }
    public Nullable<System.DateTime> LastChangeDate { get; set; }

    public List<BankListAgentId> Fixed { get; set; }
    public List<BankListAgentId> Variable { get; set; }
    public List<BankListAttachments> Attachments { get; set; }

    public BankListViewModel()
    {
        //Initialize Fixed and Variable stat Lists
        Fixed = new List<BankListAgentId>();
        Variable = new List<BankListAgentId>();

        Models.BankListAgentId agentId = new BankListAgentId();

        for (int i = 0; i < 5; i++)
        {
            Fixed.Add(agentId);
            Variable.Add(agentId);

        }

        //Initialize attachment Lists
        Attachments = new List<BankListAttachments>();
        Attachments.Add(new BankListAttachments());
    }
}
公共类BankListViewModel
{
公共int ID{get;set;}
公共字符串BankName{get;set;}
公共字符串LastChangeOperator{get;set;}
公共可为空的LastChangeDate{get;set;}
公共列表修复了{get;set;}
公共列表变量{get;set;}
公共列表附件{get;set;}
public BankListViewModel()
{
//初始化固定和可变统计列表
固定=新列表();
变量=新列表();
Models.BankListAgentId agentId=新的BankListAgentId();
对于(int i=0;i<5;i++)
{
固定。添加(agentId);
变量.Add(agentId);
}
//初始化附件列表
附件=新列表();
附件。添加(新的BankListAttachments());
}
}

问题在于您的局部视图。在主视图中的循环中,您正在传递一个
BankListAgentId
对象。但是,您的局部视图的模型类型是
@Model Monet.ViewModel.BankListViewModel

此外,您正在尝试访问局部视图中名为
item
的变量,但该变量不存在。不要使用
item
来访问数据,而是像在任何其他视图中一样使用
Model
。每个视图(即使是局部视图)都有自己的模型类型

您的局部视图应如下所示:

@model Monet.ViewModel.BankListAgentId

<td>
    @Html.DropDownListFor(model => model.StateCode,
        (SelectList)ViewBag.StateCodeList, Model.StateCode)
</td>
<td>
    @Html.EditorFor(model => model.AgentId)
    @Html.ValidationMessageFor(model => model.AgentId)
    <br />
    <a href="#" onclick="$(this).parent().remove();" style="float:right;">Delete</a>
</td>
@model Monet.ViewModel.BankListAgentId
@Html.DropDownListFor(model=>model.StateCode,
(选择列表)ViewBag.StateCodeList,Model.StateCode)
@EditorFor(model=>model.AgentId)
@Html.ValidationMessageFor(model=>model.AgentId)


传递到局部视图的模型是BankListAgentId,因为在创建局部视图时,正在循环它们的集合

到目前为止,你做的一切都是对的。在列表中循环,为每个列表项调用partial并将该项传递到partial。似乎您缺少的部分是,当您将项传递到分部中时,该项将成为分部的模型。因此,您可以像在任何其他视图中一样与它进行交互,即
@Model.BankName
@Html.DisplayFor(m=>m.BankName)
,等等。

我发现
删除
按钮只删除
删除
链接,而不是实际项目。您知道我是否需要将锚定链接放置在部分中的其他位置,或者标记其中一个html元素,如
?我认为这是选择器的错误。通过“实际项目”,我假设您指的是整个局部视图?在这种情况下,我将为要删除的元素提供一个ID。(顺便说一句,你的
周围是否缺少一个
。尝试将要删除的元素命名为
,并在链接中执行
onclick=“$('#item-@Model.AgentId')。remove();”