c# - 在 c# mvc 中发送多维对象,并渲染单个属性到 c# mvc View

标签 c# asp.net-mvc linq

我不完全确定我是否正确地使用了这个问题的标题,所以首先我深表歉意。

我有一个问题与在 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/

相关文章:

c# - LINQ to XML 绑定(bind)到 asp.Net DropDownList

c# - 异步/等待 Entity Framework ObjectContext 处置

jquery - 如何从 MVC 站点上的 Web 用户获取屏幕截图/屏幕捕获?

c# - 优化在asp.net mvc 4中将大数据集加载到表中

c# - 如何使用linq过滤SelectList

c# - 如何使用 linq to entities 获取字符串数组或 JSON 格式的数据?

c# - 我可以重用内置 IIS 身份验证但提供我自己的凭据检查吗?

c# - 使用 MVVM (C# WPF) 如何在应用程序初始化时将设置显示到它们各自的控件中?

c# - 未调用 ASP.NET 5 基于策略的授权句柄

c# - 数据库表中具有唯一 ID 但名称相同的不同行