0

我有一个List使用单独模型的集合 (a) 创建的视图模型。在我们的数据库中,我们有两个表:BankListMasterBankListAgentId。“主”表的主键用作代理 ID 表的外键。

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

我目前正在阅读Steve Sanderson关于编辑可变长度列表的博客文章。但是,从数据库中提取现有项目时,它似乎并未涵盖此特定场景。

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

The name 'item' does not exist in the current context

但是,我也尝试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

<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>

这是视图模型。它当前将固定/可变代理 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());
    }
}
4

3 回答 3

2

问题在于您的部分观点。在您的主视图中,在循环中,您正在传递一个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>
于 2013-04-03T17:03:34.163 回答
0

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

于 2013-04-03T17:03:42.323 回答
0

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

于 2013-04-03T17:07:54.620 回答