在控制器中引用模型类,因此多个数据可以在一个视图中

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.List1[app.Models.rooms]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[app.Models.SP_RESULTS]”。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:传入字典的模型项的类型为“System.Collections.Generic.List1[app.Models.rooms]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[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>

【讨论】:

以上是关于在控制器中引用模型类,因此多个数据可以在一个视图中的主要内容,如果未能解决你的问题,请参考以下文章

为每个 UITableViewCell 创建视图模型

模型与视图控制器通信的推荐方式是啥?

试图在一个视图中列出来自多个模型的信息

如何使用相同的模型对象初始化 JavaFX 控制器?

在 Swift 中跨多个选项卡访问相同的视图模型

如何处理 iOS 应用程序中的模型类