剃刀@foreach 列表问题

razor @foreach issue with lists

我尝试将列表传递到我的视图中,但出现以下错误:CS1963:在我的视图中,表达式树可能不包含动态操作,位于行@html.displayfor...

public class ColNameLink
{
    public string ColName { get; set; }
    public List<string> AvaiableDBcolumns { get; set; }
}


public class ViewModelListColumns 
{
    public List<ColNameLink> ColList { get; set; }
}

控制器

        var columnNames = (from dc in dt.Columns.Cast<DataColumn>()
                                select dc.ColumnName).ToList();

        var AvailLinks = new List<string>();
        AvailLinks.Add("FirstName");
        AvailLinks.Add("SurName");

        var viewModel = new ViewModelListColumns() { ColList = new List<ColNameLink>() };
        columnNames.ForEach(colName => viewModel.ColList.Add(new ColNameLink { ColName = colName, AvaiableDBcolumns = AvailLinks }));

        return View("ChooseColumns", viewModel);

查看

    @Model uploabulk.ViewModels.ViewModelListColumns

<table class="table">
    <tr>
        <th>Column name</th>
        <th>Database column</th>
        <th>Include?</th>
    </tr>
    @foreach (var colList in Model)
    {
        foreach (var column in colList)
        { 
            <tr>
                <td>@Html.LabelFor(m => column.ColName) </td>
                <td>Html.DropDownListFor("Selection", new SelectList(column.AvaiableDBcolumns, "AvailableDBcolumns"))</td>-->
                <td></td>
            </tr>
        }        
    }
</table>

您的代码存在一些问题。首先,您的视图模型是 uploabulk.ViewModels.ViewModelListColumns,这就是您在此处传递给它的内容:return View("ChooseColumns", viewModel);.

但是在您的视图中,您试图在 Model 上编写一些 @foreach 循环,这是不可能的,因为您只能迭代 IEnumerable 类型。

因此请确保您的视图代码与您的视图模型一致:

@model uploabulk.ViewModels.ViewModelListColumns

<table class="table">
    <tr>
        <th>Column name</th>
        <th>Database column</th>
        <th>Include?</th>
    </tr>
    @for (var i = 0; i < Model.ColList.Count; i++)
    {
        <tr>
            <td>@Html.LabelFor(m => m.ColList[i].ColName)</td>
            <td>
                @Html.DropDownListFor(
                    x => x.ColList[i].ColName, 
                    new SelectList(Model.ColList[i].AvaiableDBcolumns)
                )
            </td>
            <td></td>
        </tr>
    }
</table>

您需要引用 ColList 属性 才能对其进行迭代:

@foreach (var colList in Model.ColList)