数据表转移到Model然后转移到视图

时间:2014-11-21 21:05:13

标签: mysql asp.net-mvc asp.net-mvc-4

好的,经过大量的研究后我得出结论,将数据表传递给视图是一个坏主意,那么如何将我的数据表传递给Model,然后才能访问视图中的每一行和哪一行?对不起,我是MVC的新手

我从一个简单的SQL语句开始

StringBuilder sbSQL = new StringBuilder();
        //// define a list of CustomerModel objects
        DataSet tempDS = new DataSet();

        //string xSQL = "SELECT PropertyAddress,PropertyTypeDesc,PropertyID FROM KDOR_vwPropertyGeneral ORDER BY PropertyAddress";
        System.Data.SqlClient.SqlDataAdapter DbCmd = new System.Data.SqlClient.SqlDataAdapter();
        string sqlWhereCont = " WHERE ";
        sbSQL.Append("SELECT ");
        sbSQL.Append("PropertyAddress As PropertyAddress,");
        sbSQL.Append("PropertyTypeDesc As PropertyTypeDesc,");
        sbSQL.Append("PropertyID as PropertyID");
        sbSQL.Append(" FROM [KDOR_vwPropertyGeneral] ");
        if (!string.IsNullOrEmpty(user.Address))
        {
            sbSQL.Append(sqlWhereCont + "(PropertyAddress) LIKE '" + user.Address + "%'");
            sqlWhereCont = "AND ";
        }
        sbSQL.Append(" ORDER BY ");
        sbSQL.Append(" PropertyAddress ");



        string MyConnectionString = ConfigurationManager.ConnectionStrings["WLConnection"].ConnectionString;
        System.Data.SqlClient.SqlConnection cnn = new System.Data.SqlClient.SqlConnection(MyConnectionString);
        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sbSQL.ToString(), cnn);
        cmd.CommandTimeout = 30000;
        DbCmd.SelectCommand = cmd;

将数据移动到DataSet和数据表

DbCmd.Fill(tempDS, "ResultSet");
        DataTable resultSet = tempDS.Tables["ResultSet"];

将项目添加到模型

 var vm = new List<BedroomModel>();
        foreach (DataRow dr in tempDS.Tables[0].Rows)
        {
            vm.Add(new BedroomModel {PropertyAdd  = dr.ItemArray[0].ToString() });
            vm.Add(new BedroomModel { PropertyDesc = dr.ItemArray[1].ToString() });
            vm.Add(new BedroomModel { PropertyID = dr.ItemArray[2].ToString() });
        }

现在我如何访问每个项目并在视图中循环它们?因为我在这里得到一个错误是看看我的观点

@model DataBaseTest.Models.BedroomModel

@{
ViewBag.Title = "Result";
}

 <h2>Result</h2>
@{
ViewBag.Title = "Result";
}

<table border ="1">
<thead>
  @*  <tr>
    @foreach (var col in Model.Columns) {
        <th>
            @col.ColumnName
        </th>
    }
    </tr>*@
    <tr>
        <th>Property Address</th>
        <th>Property Description</th>
        <th>Property ID</th>
    </tr>
</thead>

<tbody>

@foreach (var item in Model.PropertyAdd)
 {         
  <tr>


      <td>@Model.PropertyAdd</td> 

  </tr> 
  }     
 </tbody>

Model
namespace DataBaseTest.Models
  {
  public class BedroomModel
    {
      public string Address { get; set; }
      public string PropertyAdd { get; set; }
      public string PropertyID { get; set; }
      public string PropertyDesc { get; set; }



       public IEnumerable<BedroomModel> BedroomModels { get; set; }
    }

}

再次抱歉,我是MVC的新手 任何建议都会得到极大的赞赏。

2 个答案:

答案 0 :(得分:1)

将此添加到顶部的视图中。

@model DataBaseTest.Models.BedroomModel

这将使视图成为强类型视图。这意味着它知道将使用什么模型来显示数据以及可用的属性。

然后在视图渲染之前在控制器方法中分配集合。

我编辑了这部分。我刚才注意到你为每个属性添加了一个新对象,而不是将属性分配给一个对象然后添加它们。然后你会得到一个空引用。

public ActionResult MyView()
{
    BedroomModel lModel = new BedroomModel();
    lModel.BedroomModels = new List<BedroomModels>();

    DataSet tempDS = CallToBLLOrDAL(); //Do what you need to do to get your data.

    //Assign your values to the ViewModel (Aka lModel in this instance).
    foreach (DataRow dr in tempDS.Tables[0].Rows)
    {
        //I am unsure exactly why you are calling ItemArray and adding a new Model for each column.
        //Your way.
        lModel.BedroomModels.Add(new BedroomModel { PropertyAdd = dr.ItemArray[0].ToString() });
        lModel.BedroomModels.Add(new BedroomModel { PropertyDesc = dr.ItemArray[1].ToString() });
        lModel.BedroomModels.Add(new BedroomModel { PropertyID = dr.ItemArray[2].ToString() });

        //Try this
        lModel.BedroomModels.Add(new BedroomModel { PropertyAdd = dr.ItemArray[0].ToString(), PropertyDesc = dr.ItemArray[1].ToString(), PropertyID = dr.ItemArray[2].ToString()});
    }
    return View(lModel);
}

然后在你看来。

@foreach (BedroomModel lBedroomModel in Model.BedroomModels)
{
    <td>
        @lBedroomModel.PropertyAdd
    </td>
}

调试提示。

您可以在foreach中的视图中设置断点。将模型拖到手表上。您应该能够看到模型的总体和当前范围内的所有值。

我不确定为什么在视图代码段上关闭着色。

让我知道你的想法。

如果这有帮助,请设置为答案。

答案 1 :(得分:1)

您正在告诉您的观点,当您确实想要将BedroomModel对象传递给它时,它应该查找单个List<BedroomModel>对象。

@model List<DataBaseTest.Models.BedroomModel>

因此,您的Model属性将成为列表本身,因此您的foreach循环只需循环遍历Model,而不是Model.BedroomModels

@foreach (var item in Model)
{         
    <tr>
        <td>@item.PropertyAdd</td>
        <td>@item.PropertyDesc</td>
        <td>@item.PropertyID</td>
    </tr> 
}  

由于此更改,您可以从BedroomModels课程中删除BedroomModel媒体资源。

public class BedroomModel
{
  public string Address { get; set; }
  public string PropertyAdd { get; set; }
  public string PropertyID { get; set; }
  public string PropertyDesc { get; set; }
}

这样可以解决您的问题,但我也注意到在填充vm列表时,您要在列表中添加三个项目,您应该只添加一个BedroomModel对象。您的foreach循环应如下所示:

var vm = new List<BedroomModel>();
foreach (DataRow dr in tempDS.Tables[0].Rows)
{
    vm.Add(new BedroomModel 
    {
        PropertyAdd  = dr.ItemArray[0].ToString(),
        PropertyDesc = dr.ItemArray[1].ToString(),
        PropertyID = dr.ItemArray[2].ToString()
    };
}

您还必须确保将ViewModel发送到View中。你的行动应该回归:

return View(vm);