C# 列表<;T>;传递给控制器发送空项

C# 列表<;T>;传递给控制器发送空项,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,PartialView包含一个带有列表的模型Foo。每个Bar项包含两个属性,BarA(string)和BarB(十进制)。 我试图在该局部视图中呈现图表,但为了使其正常工作,我需要在同一控制器上调用一个操作,并将结果传递给 字符串[]BarAs=ViewBag.BarAs;//这将指定null 十进制[]倒钩=ViewBag.BarBs;//这也会指定null 通过GET请求将复杂类型传递给操作在技术上是一件非常棘手的事情,因此我不知道此解决方案是否适合您的需要。您可以按照下面的方法进行操作

PartialView包含一个带有
列表的模型
Foo
。每个
Bar
项包含两个属性,
BarA
string
)和
BarB
(十进制)。
我试图在该局部视图中呈现图表,但为了使其正常工作,我需要在同一控制器上调用一个操作,并将结果传递给

字符串[]BarAs=ViewBag.BarAs;//这将指定null
十进制[]倒钩=ViewBag.BarBs;//这也会指定null

通过GET请求将复杂类型传递给操作在技术上是一件非常棘手的事情,因此我不知道此解决方案是否适合您的需要。您可以按照下面的方法进行操作

@{
    string[] barAs = Model.Select(m => m.BarA).ToArray();
    decimal[] barBs = Model.Select(m => m.BarB).ToArray();
    ViewBag.BarAs = barAs; // this has 3 items with the expected data
    ViewBag.BarBs = barBs; // this also works
}
<img src="@Url.Action("GenerateChart")" />

string[] BarAs = ViewBag.BarAs; // this assigns null
decimal[] BarBs = ViewBag.BarBs; // this also assigns null
您的操作将以序列化字符串的形式接收模型,您必须将其反序列化到您的模型中

public void GenerateChart()
{
    var chart = new System.Web.Helpers.Chart(400, 200)
    .AddTitle("Title")
    .AddSeries(
        name : "name",
        xValue : ViewBag.BarA,
        yValues : ViewBag.BarB)
    .Write();
}
我也想知道是否有更有效的方法通过get请求来实现这一点


希望这有帮助

通过GET-request将复杂类型传递给actions在技术上是一件血腥的事情,因此我不知道该解决方案是否适合您的需要,您可以按照下面的方法进行操作

@{
    string[] barAs = Model.Select(m => m.BarA).ToArray();
    decimal[] barBs = Model.Select(m => m.BarB).ToArray();
    ViewBag.BarAs = barAs; // this has 3 items with the expected data
    ViewBag.BarBs = barBs; // this also works
}
<img src="@Url.Action("GenerateChart")" />

string[] BarAs = ViewBag.BarAs; // this assigns null
decimal[] BarBs = ViewBag.BarBs; // this also assigns null
您的操作将以序列化字符串的形式接收模型,您必须将其反序列化到您的模型中

public void GenerateChart()
{
    var chart = new System.Web.Helpers.Chart(400, 200)
    .AddTitle("Title")
    .AddSeries(
        name : "name",
        xValue : ViewBag.BarA,
        yValues : ViewBag.BarB)
    .Write();
}
我也想知道是否有更有效的方法通过get请求来实现这一点


希望这有帮助

看来您并不真正了解MVC是如何工作的。我鼓励您花一些时间阅读上的所有教程,以熟悉该框架。也就是说,您似乎正在尝试处理很多这方面的问题,就好像您身处Web表单的世界一样。MVC是一个完全不同的野兽

首先,
Html.Action
无法返回完整图像,因为它所要做的只是将返回值转储到正在生成的Html中,并且不能在Html中直接嵌入二进制对象

其次,即使可以,也不能将其用作
img
标记的
src
src
必须是一个字符串,即指向图像位置的URL

因此,为了实现这一点。您将需要一个完整的操作,以图像的形式返回正确的响应。然后,您可以简单地将图像
src
链接到点击此操作的路径

public ActionResult GenerateChart(string modelAsString)
{
    List<Bar> model = new List<Bar>();
    model = JsonConvert.DeserializeObject<List<Bar>>(modelAsString);

    var chart = new System.Web.Helpers.Chart(400, 200)
    .AddTitle("Title")
    .AddSeries(
        name: "name",
        xValue: model.Select(m => m.BarA).ToArray(),
        yValues: model.Select(m => m.BarB).ToArray())
    .GetBytes("jpeg");

    return File(chart, "image/jpeg");
}
公共行动结果生成部分(列表模型)
{
var chart=new System.Web.Helpers.chart(400200)
.AddTitle(“标题”)
.AddSeries(
姓名:“姓名”,
xValue:model.Select(m=>m.BarA.ToArray(),
Y值:model.Select(m=>m.BarB.ToArray())
.GetBytes(“jpeg”);
返回文件(图表,“图像/jpeg”);
}
那么



现在,您只需链接到一个URL。该URL映射到点击
GenerateChart
操作的路径,然后该操作返回一个实际图像,就像直接链接到物理图像一样。现在,浏览器可以正确地将
img
标记呈现到页面上。

您似乎不太了解MVC是如何工作的。我鼓励您花一些时间阅读上的所有教程,以熟悉该框架。也就是说,您似乎正在尝试处理很多这方面的问题,就好像您身处Web表单的世界一样。MVC是一个完全不同的野兽

首先,
Html.Action
无法返回完整图像,因为它所要做的只是将返回值转储到正在生成的Html中,并且不能在Html中直接嵌入二进制对象

其次,即使可以,也不能将其用作
img
标记的
src
src
必须是一个字符串,即指向图像位置的URL

因此,为了实现这一点。您将需要一个完整的操作,以图像的形式返回正确的响应。然后,您可以简单地将图像
src
链接到点击此操作的路径

public ActionResult GenerateChart(string modelAsString)
{
    List<Bar> model = new List<Bar>();
    model = JsonConvert.DeserializeObject<List<Bar>>(modelAsString);

    var chart = new System.Web.Helpers.Chart(400, 200)
    .AddTitle("Title")
    .AddSeries(
        name: "name",
        xValue: model.Select(m => m.BarA).ToArray(),
        yValues: model.Select(m => m.BarB).ToArray())
    .GetBytes("jpeg");

    return File(chart, "image/jpeg");
}
公共行动结果生成部分(列表模型)
{
var chart=new System.Web.Helpers.chart(400200)
.AddTitle(“标题”)
.AddSeries(
姓名:“姓名”,
xValue:model.Select(m=>m.BarA.ToArray(),
Y值:model.Select(m=>m.BarB.ToArray())
.GetBytes(“jpeg”);
返回文件(图表,“图像/jpeg”);
}
那么



现在,您只需链接到一个URL。该URL映射到点击
GenerateChart
操作的路径,然后该操作返回一个实际图像,就像直接链接到物理图像一样。现在,浏览器可以正确地将
img
标记呈现到页面上。

您的代码是否引发异常?调试时,控制器是否正确分配数组?@GabrielLuci调试时不会引发异常,因为我在到达Linq语句之前停止它,否则会引发NullReferenceException。安德烈斯,你指的是第二个案子吗?我想和安德烈斯一样。当您点击GenerateChart(列表模型)时,“模型”是否确实包含任何项?@GabrielLuci是的,它包含它必须包含的3项,但这些项为空。您的代码是否引发异常?当您调试时,控制器是否正确分配了数组?@GabrielLuci调试时没有引发异常,因为我在到达Linq语句之前停止了它,否则会引发NullReferenceException。安德烈斯,你指的是第二个案子吗?我想和安德烈斯一样。当您点击GenerateChart(列表模型)时,“模型”是否确实包含任何项?@GabrielLuci是的,它包含它必须包含的3项,但这些项为空这是
GenerateChart
方法声明的正确方式,但我们仍然需要以序列化字符串的形式传递数据。不是吗@你应该考虑像克里斯提到的那样优化你的方法宣言。在MVC中,直接编写输出不是一种合适的方式。我也编辑了我的答案。这是
GenerateChart
方法声明的正确方式,但我们仍然需要以序列化字符串的形式传递数据。不是吗@你应该考虑去优化你的方法。
public ActionResult DummyData()
{
    List<Bar> model = new List<Bar>();
    model.Add(new Bar() { BarA = "barAData", BarB = 1.1m });
    model.Add(new Bar() { BarA = "barAData2", BarB = 441.14m });
    model.Add(new Bar() { BarA = "barAData43", BarB = 44.1m });
    return Json(model, JsonRequestBehavior.AllowGet);
}
public ActionResult GenerateChart(List<Bar> model)
{
    var chart = new System.Web.Helpers.Chart(400, 200)
        .AddTitle("Title")
        .AddSeries(
            name : "name",
            xValue : model.Select(m => m.BarA).ToArray(),
            yValues : model.Select(m => m.BarB).ToArray())
    .GetBytes("jpeg");

    return File(chart, "image/jpeg");
}
<img src="@Url.Action("GenerateChart", new { model = rvd })" alt="" />