通过ViewBag/ViewData将列表移动到视图,并在MVC 4中从中进行选择



我正在重构别人用ASP写得不好的应用程序。NET MVC 4(Razor(。.NET不是我的专长,我主要做C/C++。他没有按照MVC规范的方式进行数据库访问。他为每个表使用一个Repository类来在SQL Server上执行所有SQL命令,而不是让基本的实体框架来完成繁重的工作。应用程序必须:

  • 从控制器中读取表中的行列表(他有一个表的Model(。

  • 将此模型对象列表返回到视图(ViewBag或ViewData最简单(。

  • 在"视图"中的表或列表中插入列表成员。

  • 选择一行(表示列表中的(将所选行返回到控制器ActionResult-模型类中的单个表记录

在控制器调用的存储库类(部分代码(中:
public List<Note> GetNotesByWorkGroup(string workGroup)
{
  List<Note> notes = new List<Note>;
  string sql = "SELECT * FROM tblNotes where WorkGroup = 'Foo';
  SqlCommand sqlCmd = new SqlCommand(sql, conn);
  SqlDataReader myReader = sqlCmd.ExecuteReader();
  if (myReader.HasRows)
  {
    while (myReader.Read())
    {
      Note note = new Note();
      note.NoteId = myReader.GetInt32(NoteIdOrdinal);
      note.DateTime = myReader.GetDateTime(DateTimeOrdinal);
      note.WrittenBy = myReader.GetString(WrittenByOrdinal);
      notes.Add(note);
    }
  }
  return notes;
}

控制器收到此消息,必须将其传递给视图。他通过名单的方式是:

List<Note> notes = noteRepository.GetNotesByWorkGroup();
ViewData["myList"] = notes;

在看来,他把一切都搞砸了。最简单的解决方案是为每个必须可点击的元素(按钮或href?(创建一个带有onclick(note.Id(的表或列表。每一行都需要一个可点击的元素和Note对象中的另一个文本元素,才能显示两行。

例如,它需要看起来像这样,Date是可选字段,WrittenBy只是文本。

Date1  WrittenBy  
Date2  WrittenBy
Date3  WrittenBy

然后,javascript函数可以接收Id onclick((并将其提交给控制器ActionResult((。

我只需要一个View代码示例(MVC 4、C#、Razor(,显示ViewData["myList"]是如何从C#取消引用到HTML并插入到列表或表中的行中的。此外,如何在传递parm的javascript函数中编写提交?

对视图有什么建议和示例吗?

您可以使用ViewModel、ViewBag或ViewData方法执行此任务。

ViewModel

foreach (var item in Model.myList)
       { }

ViewBag或ViewData
您可以创建一个表,然后可以遍历所有数据。

<table>
<tr>
<td>date</td>
<td>writtenby</td>
</tr>
    @foreach (var item in ViewData["myList"])
           {
    <tr>
    <td>@item.date</td>
    <td>@item.writtenby</td>
    </tr>
          } 
</table>

我的第一个建议是从控制器返回钞票,而不是设置View Data

如果不是,您应该能够像访问数组一样访问ViewData["myList"]。ViewData["myList"][0].properyName.

我希望这能有所帮助,如果我能找到一些示例代码,我会更新这篇文章。

 @{ 
      List<Note> _list = ViewData["myList"] as List<Note>;
   }
    @if (_list != null)
    {
        foreach (var item in _list)
        {
            @Html.ActionLink(item, "Index");
        }
    }

试试看,希望会有帮助。感谢

相关内容

最新更新