我不完全确定我是否正确地使用了这个问题的标题,所以首先我深表歉意。
我有一个问题与在 C# MVC Controller 中使用 LINQ 从数据库查询呈现到 View 的值(以及所述值的计数)有关。该 View 是使用第一个值作为可见值,然后使用第二个值来确定应用于第一个值的元素的 CSS。
举个例子,我有一个序列
1, 1, 1, 2, 2, 4, 5, 5, 5, 3, 3, 4, 4, 2, 2, 2 etc.
为此运行的值将是
3, 3, 3, 2, 2, 1, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3 etc.
每个值都将呈现在一个单独的 div 中以进行屏幕换行,但根据所述数字的运行,将被着色以反射(reflect)有一个数字运行;
<div style="float:left; background-color:red">1</div> //
<div style="float:left; background-color:red">1</div> // three the same = red
<div style="float:left; background-color:red">1</div> //
<div style="float:left; background-color:yellow">2</div> // two the same = yellow
<div style="float:left; background-color:yellow">2</div> //
<div style="float:left; background-color:green">4</div> // single instance = green
<div style="float:left; background-color:red">5</div> // etc.
etc.
Controller 包含一个 ActionResult:
public ActionResult getDataAndDisplay (int bar)
{
var runOfNumbers = new ???;
using (var foo = new Entities())
{
initialRunOfNumbers = (from n in foo.Numbers
where foo.bar == bar
select n.number).ToArray();
// loop through numbers and get counts set for each number - the code for calculating the run count is sorted
// end result should be pairs of values; number, countOfNumberRun
// assign eventual list(?) of pairs to runOfNumbers
}
return View("numbers", "show", new {RunOfNumbers = runOfNumbers} )
}
并且 View 简单地以合适的格式打印出每个数字:
@model NumberRunMachine.Models.NumberRunModel;
//traditional HTML header code, get to body
@foreach(var item in Model.RunOfNumbers)
{
<div class="run-of-number-style-@item.countOfNumberRun">@item.number</div>
}
CSS:
.run-of-number-style-1
{
background-color:green;
}
.run-of-number-style-2
{
background-color:yellow;
}
.run-of-number-style-3
{
background-color:red;
}
我的主要问题是如何最好地将数字和运行计数一起发送到 View ,从而允许根据需要呈现每对的单独方面?我查看了匿名对象、锯齿状数组、多维数组、数组列表(明确使用 ToList() 等)——要么我没有得到正确的代码,要么就是没有任何智能感知助手来显示哪个一个允许我在 View 中需要的粒度。
我可以获得一个多维数组来发送值,但 View 不允许我提取单个值。最佳做法是什么?我错过了什么?
编辑:添加模型以便人们获得完整的 MVC :)
public class PageRunModel : Model
{
// I am currently getting all information as a multidimensional array, but can't separate it out
public byte[,] RunOfNumbers { get; set; }
}
最佳答案
您遇到的一个问题可能是您在 Controller 上发送一个匿名对象作为模型,但 View 需要一个特定的类 NumberRunMachine.Models.NumberRunModel
。
为了向 View 发送数据,我可以想到 3 个备选方案:
<强>1。使用 ViewData 发送额外数据以查看
您可以使用 ViewDataDictionary
向 View 发送更多数据,以免改变主模型。假设您有一个要发送到 View 的 UserInfo
类:
Controller
public ActionResult getDataAndDisplay (int bar)
{
//...
ViewData["userInfo"] = userInfo;
//...
return View("numbers", "show", new NumberRunModel(){RunOfNumbers = runOfNumbers} )
}
查看
@{
UserInfo user = ViewData["userInfo"] as UserInfo;
}
<b>User name:</b> @user.Name
<!-- And so on... -->
<强>2。创建一个新的自定义 ViewModel 类
您可以仅为该 View 定义另一个 ViewModel 类,并根据需要添加属性:
View 模型
public class DataDisplayViewModel
{
public UserInfo User { set; get; }
public byte[,] RunOfNumbers { set; get; }
}
Controller
public ActionResult getDataAndDisplay (int bar)
{
//...
return View("numbers", "show", new DataDisplayViewModel(){User = userInfo, RunOfNumbers = runOfNumbers});
}
查看
@model DataDisplayViewModel
<!-- ... -->
@for (int i = 0; i < Model.RunOfNumbers.GetLength(0); i++)
{
<div class="run-of-number-style-@Model.RunOfNumbers[i,0].ToString()">
@Model.RunOfNumbers[i,1].ToString()
</div>
}
<!-- ... -->
<b>User name:</b> @Model.User.Name
<!-- And so on... -->
<强>3。使用动态模型
从 MVC3 开始,您可以使用动态
模型将匿名类型的对象传递给 View :
Controller
public ActionResult getDataAndDisplay (int bar)
{
//...
return View("numbers", "show", new {User = userInfo, RunOfNumbers = runOfNumbers});
}
查看
@model dynamic
<!-- ... -->
@for (int i = 0; i < Model.RunOfNumbers.GetLength(0); i++)
{
<div class="run-of-number-style-@Model.RunOfNumbers[i,0].ToString()">
@Model.RunOfNumbers[i,1].ToString()
</div>
}
<!-- ... -->
<b>User name:</b> @Model.User.Name
<!-- And so on... -->
如果您使用的是版本 3 以下的 MVC,您可以查看这篇文章:Passing anonymous objects to MVC views and accessing them using dynamic
关于c# - 在 c# mvc 中发送多维对象,并渲染单个属性到 c# mvc View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20549967/