我正在Mvc建立一个项目并遇到一些麻烦。我以前曾经无数次使用过viewmodels,以及Controller-View之间的关系,但这个问题让我很难过。
我想将一个连接表传递给视图,我不知道该怎么做。
这是查询的代码
var query1 =
from r in db.Requests
group r by r.RequestNum into rsg
select new
{
rsg,
TechHrsSum = (from rr in rsg select rr.RequestSteps.Select ( rs => rs.Procedure.TechHrs).Sum(h => h)),
ProcessHrsSum = (from rr in rsg select rr.RequestSteps.Select ( rs => rs.Procedure.ProcessHrs).Sum(h => h))
};
我知道这是匿名的,但我无法理解如何传递数据,因此它在视图中是动态的和可用的。谢谢!
答案 0 :(得分:2)
您可以选择创建一个类对象,该对象具有要传递给视图的值的属性。或者您可以将对象放在ViewBag中并通过它访问值。我会推荐第一个选项。
答案 1 :(得分:1)
您有多种选择,但您的评论可能不准确。
How to pass a joined table to a Model View Controller View.
你传递的传统意义上的表格,你传递了一系列建模数据。建模数据将表示从数据库中检索的数据结构。这是模型视图控制器的整个前提,以体现超文本传输协议的无状态特性的方式抽象数据。
最简单的方法是在不仅将其用于后端而且还用于用户界面的环境中定义模型。
我有一个结算对象,它需要以下信息:
- 人
- 帐户
- 地址
- 总
正如您可以看到Billing
对象虽然它被简单定义,但我们的上下文开始体现实现,因此真正的形状开始被定义。为简单起见,我将模拟一个简单的模型:
// Example Model:
public class Person
{
public string FirstName { get; set; }
public string LastName {get; set; }
}
因此,定义 Person 的前提,每当我的 View 需要显示 Person 时,我总是需要以下定义。
重要提示:定义模型后,我们知道我们的数据层需要填充建模数据,而我们的业务逻辑将会正常工作与这些实体。为简单起见,采用线性方法:
// Controller:
public ActionResult Index(int? id)
{
// Person Model:
var model = new Person();
// Call Database Method, to populate Model
model = dbPerson.Fill(id); // dbPerson.Fill would be a method to populate.
return View(model);
}
// View: (Index of our Controller)
@if(Model != null)
{
foreach(var content in Model)
{
<div>@content.FirstName</div>
<div>@content.LastName</div>
}
}
通过在 Collection 中声明var
,将在编译时定义类型。
这就是你传输数据的方式。这种基本方法适用于更复杂的对象。特别是因为您的表格视图可以包含任何对象,因此可以显示它。希望这有点澄清。
我可能误解了你的意图,但我确实相信你在整体概念上挣扎。请记住,模型视图控制器代表:
答案 2 :(得分:0)
一个非常简单的想法是将模型更改为&#34; NotMapped&#34;来自其他表的信息列(假设为1:1关系):所以在模型中:
[NotMapped]
public string myStringVar { get; set; }
然后在控制器中:
ourTableModel.myStringVar = ""; // default
if (ourTableModel.ourTableModel_key != null)
{
var ourOtherTable = db.otherTable.Find(ourTableModel.ourTableModel_key);
if (ourOtherTable != null)
{
ourTableModel.myStringVar = ourOtherTable.stringInOtherTable;
}
}
只要这是一个R(检索或读取)操作,这就像在其他任何内容中一样容易在视图中显示,相反,如果正在进行CUD操作,则有策略将其保存在控制器中。