好的,经过大量的研究后我得出结论,将数据表传递给视图是一个坏主意,那么如何将我的数据表传递给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的新手 任何建议都会得到极大的赞赏。
答案 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);