【问题标题】:Razor Pages - Foreach loop through list to get data to display on razor viewRazor Pages - Foreach 循环遍历列表以获取要在 razor 视图上显示的数据
【发布时间】:2020-03-18 18:21:42
【问题描述】:

我无法让数据显示在剃刀视图上。我目前正在 DataAccessLayer.GetData() 函数中获取数据并填充我的对象。我的对象列表被填充和存储。但是,我的对象列表计数在剃刀视图上为 0,因此它什么也不显示。我是否在视图上正确“更新”我的对象?这是第一次使用剃须刀页面模板,所以这是一个学习曲线。

剃刀页面:

<form method="post" asp-page-handler="GetData">
    <input id="txtSearch" name="search" />
    <button class="btn btn-lg btn-dark" id="btnSubmit" name="Submit" />
</form>


@{ List<ObjectsModel> objects = new List<ObjectsModel>();

    @foreach (var record in objects)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN2)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN3)
            </td>
        </tr>
    }
}

页面模型:

 public class ObjectsModel : PageModel
{
    public string COLUMN1 { get; set; }
    public string COLUMN2 { get; set; }
    public string COLUMN3 { get; set; }

    public void OnGet()
    {

    }

    public void OnPostGetData(string search)
    {

        List<ObjectsModel> objects = new List<ObjectsModel>();

        DataAccessLayer.GetData(search, out objects);
        return;
    }
}

DataAccessLayer:

public class DataAccessLayer
    {
        public static bool GetData(string ID, out List<ObjectsModel> objects)
        {
            string connectionString = "";
            objects = new List<ObjectsModel>();

            try
            {
                SqlConnection connection = new SqlConnection(connectionString);
                connection.Open();

                SqlCommand command = connection.CreateCommand();

                command.CommandType = System.Data.CommandType.Text;

                command.CommandText = @"SELECT top 50 COLUMN1, COLUMN2, COLUMN3
                                         "FROM Table";


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ObjectsModel item = new ObjectsModel();                
                    item.COLUMN1 = reader.GetValue(0).ToString().Trim();
                    item.COLUMN2 = reader.GetValue(1).ToString().Trim();
                    item.COLUMN3 = reader.GetValue(2).ToString().Trim();

                    objects.Add(item);
                }

                    reader.Close();
                    reader = null;
                    command = null;         
                    connection.Close();
                    connection = null;

                    return true;
            }
            catch (Exception exc)
            {
                exc.ToString();
                return false;
            }
        }
    }

【问题讨论】:

  • “我是否在视图上正确地“更新”了我的对象?看起来不是 - 您正在视图中构建一个全新的列表,这当然是空的。您需要引用您在 PageModel 中构建和添加的列表。
  • 所以我引用了 OnPostGetData 处理程序方法。问题是我无法在视图端引用对象列表,因为“它不存在”。如何在不在视图中创建新列表的情况下访问列表?
  • 你的代码在很多地方都是错误的,你根本没有向你的视图发送模型,GetData 填充了错误的列表,你已经在你的类中定义了公共列表。看起来您跳过了一些教程...首先尝试在包含数据库之前将 List 发送到您的视图模型
  • @Djuro 我明白你在说什么。让我做一些更改,阅读更多文档,然后我会更新代码!
  • @Djuro 我已经更新了代码。我在模型类中取出了公共列表,现在只是在我的 Data Access.GetDataFunction() 中生成它。列表正在填充中,调试时在查看页面上可以看到计数为 50。但是,当继续通过时,它会变为 0。我知道这是因为我正在视图页面上创建一个新列表。如何在不生成新实例的情况下初始化该列表?

标签: c# asp.net-core razor-pages asp.net-core-3.0


【解决方案1】:

更改这部分代码

@{ List<ObjectsModel> objects = new List<ObjectsModel>();

    @foreach (var record in objects)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN2)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN3)
            </td>
        </tr>
    }
}

到这里

public class ObjectsModel : PageModel
{
    public string COLUMN1 { get; set; }
    public string COLUMN2 { get; set; }
    public string COLUMN3 { get; set; }

    public List<ObjectsModel> objects{get; set;}

    public void OnGet()
    {

    }

    public void OnPostGetData(string search)
    {

        DataAccessLayer.GetData(search, out objects);
        return;
    }
}



@{ 

    @foreach (var record in Model.objects)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN2)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN3)
            </td>
        </tr>
    }
}

【讨论】:

  • 好的,我做了更改。但是,它现在说对象引用未设置为对象的实例。
  • 这很接近,但我需要在我的 ObjectsModel 中实例化对象列表,以便在我的 Razor 页面中访问它。我在下面发布了一个答案,它准确地显示了我所做的。 +1 并接受这个作为答案,因为你把我推向了正确的方向。谢谢!
【解决方案2】:

我通过将我的 objects List 属性添加到我的 Objects Model 并在那里而不是在视图页面上对其进行初始化来使其工作。我不再需要 Razor 视图中的引用,因为我可以使用 @Model.objects 访问我的循环中的列表。显然我已经更改了我的页面模型和属性的名称,因为这最终将是一个生产中的实时项目。

更新的 PageModel:

 public class ObjectsModel : PageModel
{
    public class Object
    {
        public string COLUMN1 { get; set; }
        public string COLUMN2 { get; set; }
        public string COLUMN3 { get; set; }
        public List<ObjectsModel> objects = new <ObjectsModel>();
    }

    public void OnGet()
    {

    }

    public void OnPostGetData(string search)
    {    
        DataAccessLayer.GetData(search, out objects);
        return;
    }
}

更新的 Razor 页面:

@{

    @foreach (var record in @Model.objects)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN2)
            </td>
            <td>
                @Html.DisplayFor(modelItem => record.COLUMN3)
            </td>
        </tr>
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 2020-04-03
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多