在控制器中引用模型类,因此多个数据可以在一个视图中
Posted
技术标签:
【中文标题】在控制器中引用模型类,因此多个数据可以在一个视图中【英文标题】:Reference model class in controller, so muliple data can be in one view 【发布时间】:2017-10-05 10:50:49 【问题描述】:我正在尝试从多个 SQL Server 存储过程中获取数据,以便在 1 个视图中访问,这样我就可以运行比较并创建图形/网格等。
我让每个部分独立工作,我现在正努力让他们一起工作。
我已经更改了我的控制器并将字段类型放入它们自己的类中,然后创建了一个“Ring of Rings”类,并将它们全部放入。
namespace APP.Models
public class SP_RESULTS
public type Type get; set;
public status Status get; set;
public condition Condition get; set;
public rooms Rooms get; set;
public class type
[Key]
public decimal type_id get; set;
public string type_code get; set;
public string type_name get; set;
public class status
//status
public decimal status_id get; set;
public string status_code get; set;
public string status_name get; set;
public string rentable get; set;
public class condition
//condition
public decimal condition_id get; set;
public string condition_code get; set;
public string condition_name get; set;
public string rentable get; set;
public int colour_code get; set;
public int service_order get; set;
public class rooms
//rooms
public decimal room_id get; set;
public string room_no get; set;
public decimal type_id get; set;
public int floor get; set;
public decimal status_id get; set;
public decimal condition_id get; set;
然后我修改了运行 SQL Server 存储过程的控制器的每个部分,以使用正确的类名而不是“环”名称,即 IE:
var outputmodel4 = new List<rooms>();
var command4 = db.Database.Connection.CreateCommand();
command4.CommandText = "SELECT rooms.room_id , rooms.room_no , rooms.type_id , rooms.floor_no , rooms.status_id , rooms.condition_id FROM rooms";
using (var SPOutput4 = command4.ExecuteReader())
foreach (var row in SPOutput4)
outputmodel4.Add(new rooms()
room_id = (decimal)SPOutput4["room_id"],
room_no = (string)SPOutput4["room_no"],
type_id = (decimal)SPOutput4["type_id"],
floor_no = (int)SPOutput4["floor_no"],
status_id = (decimal)SPOutput4["status_id"],
condition_id = (decimal)SPOutput4["condition_id"],
);
db.Database.Connection.Close();
return View(outputmodel4);
...etc for other SQL stored procedures
..和我的观点一样
@model IEnumerable<app.Models.SP_RESULTS >
<table class="table">
<tr>
<th>
@html.DisplayNameFor(model => model.Rooms.room_id)
</th>
<th>
@Html.DisplayNameFor(model => model.Rooms.room_no)
</th>
<th></th>
</tr>
@foreach (var item in Model)
<tr>
<td>
@Html.DisplayFor(modelItem => item.Rooms.room_id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rooms.room_no)
</td>
</tr>
</table>
…etc for the other models
在 VBS 中一切看起来都很好(没有红色的摆动),但是当我在浏览器中访问视图时,出现错误:
“/”应用程序中的服务器错误。
传入字典的模型项的类型为“System.Collections.Generic.List
1[app.Models.rooms]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1[app.Models.SP_RESULTS]”。说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidOperationException:传入字典的模型项的类型为“System.Collections.Generic.List
1[app.Models.rooms]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1[app.Models.SP_RESULTS]”。
如果我回到我的“戒指”模型,并将其更改为:
public class SP_RESULTS
public IEnumerable<type> Type get; set;
public IEnumerable<status> Status get; set;
public IEnumerable<condition> Condition get; set;
public IEnumerable<rooms> Rooms get; set;
并在我的控制器中更改以下行:
var outputmodel4 = new List<rooms>();
outputmodel4.Add(new rooms()
到
var outputmodel4 = new List<SP_RESULTS>();
outputmodel4.Add(new SP_RESULTS()
VBS 告诉我那个
SP_RESULTS 不包含 room_id 的定义
我尝试在定义前加上类名,但没有成功。
我看过 SO,fourms.asp.net 和 google.. 看不到解决方案(可能有,但我不确定我在寻找什么解决方案....如果有意义的话)。
有人能告诉我我需要做什么才能让我的所有模型类在同一个视图中工作吗?
我现在道歉,因为我意识到这个问题可能已经被问了好几(百万)次,但我似乎无法确定跳出来说这是这样做的。
【问题讨论】:
感谢@marc_s 的编辑 :-) 您是否正在编写 SQL(结构化查询语言)并且真的是指 Microsoft SQL Server(实际产品)?如果是:请添加sql-server
标签以明确这一点。如果不是:什么这是用于数据库系统的?
完成。再次感谢您
【参考方案1】:
对于其他寻找答案的人(以及未来的我),我通过放置这样的模型来完成这项工作:
namespace APP.Models
public class SP_RESULTS
public type Type get; set;
public status Status get; set;
public condition Condition get; set;
public rooms Rooms get; set;
public class type
[Key]
public decimal type_id get; set;
public string type_code get; set;
public string type_name get; set;
public class status
//status
public decimal status_id get; set;
public string status_code get; set;
public string status_name get; set;
public string rentable get; set;
public class condition
//condition
public decimal condition_id get; set;
public string condition_code get; set;
public string condition_name get; set;
public string rentable get; set;
public int colour_code get; set;
public int service_order get; set;
public class rooms
//rooms
public decimal room_id get; set;
public string room_no get; set;
public decimal type_id get; set;
public int floor get; set;
public decimal status_id get; set;
public decimal condition_id get; set;
在控制器中为每个 Store 过程使用 VIEWDATA:
var outputmodel3 = new List<SP_RESULTS.conditions>();
var command3 = db.Database.Connection.CreateCommand();
command3.CommandText = "dbo.pr_PROCEDUREONE";
command3.CommandType = System.Data.CommandType.StoredProcedure;
using (var SPOutput3 = command3.ExecuteReader())
foreach (var row in SPOutput3)
outputmodel3.Add(new SP_RESULTS.conditions()
condition_id = (decimal)SPOutput3["condition_id"],
condition_code = (string)SPOutput3["condition_code"],
condition_name = (string)SPOutput3["condition_name"],
);
ViewData["CONDITIONSOutput"] = outputmodel3;
var outputmodel4 = new List<SP_RESULTS.rooms>();
var command4 = db.Database.Connection.CreateCommand();
command4.CommandText = "SELECT rooms.room_id , etc FROM rooms";
using (var SPOutput4 = command4.ExecuteReader())
foreach (var row in SPOutput4)
outputmodel4.Add(new SP_RESULTS.rooms()
room_id = (decimal)SPOutput4["room_id"],
room_no = (string)SPOutput4["room_no"],
);
ViewData["ROOMSOutput"] = outputmodel4;
db.Database.Connection.Close();
return View();
..然后将我的观点改为阅读:-
table class="table">
<tr>
<th>
Condition ID
</th>
<th>
Condition code
</th>
<th>
Condition name
</th>
<th>
is it rentable?
</th>
<th>
Condition color code
</th>
<th>
Condition service order
</th>
<th></th>
</tr>
@foreach (var item in ViewData["CONDITIONSOutput"] as IEnumerable<Happ.Models.SP_RESULTS.conditions>)
<tr>
<td>
@item.condition_id
</td>
<td>
@item.condition_code
</td>
<td>
@item.condition_name
</td>
<td>
@item.rentable
</td>
<td>
@item.colour_code
</td>
<td>
@item.service_order
</td>
</tr>
</table>
<table class="table">
<tr>
<th>
Room ID
</th>
<th>
Room No
</th>
<th>
Rooms type_id
</th>
<th></th>
</tr>
@foreach (var item in ViewData["ROOMSOutput"] as IEnumerable<APP.Models.SP_RESULTS.rooms>)
<tr>
<td>
@item.room_id
</td>
<td>
@item.room_no
</td>
</tr>
</table>
【讨论】:
以上是关于在控制器中引用模型类,因此多个数据可以在一个视图中的主要内容,如果未能解决你的问题,请参考以下文章