簡體   English   中英

清單 <T> 傳遞給控制器​​發送空項目

[英]List<T> passed to controller sends empty items

PartialView包含一個具有List<Bar>的模型Foo 每個Bar項都包含兩個屬性,即BarAstring )和BarB (十進制)。
我試圖在該局部視圖中呈現一個Chart,但是要使其正常工作,我需要在同一Controller上調用一個動作,並將結果傳遞給<img />元素。 要渲染圖表,我需要BarABarB的集合來格式化數據。
所以我正在嘗試這樣的事情:

調節器

public void 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())
    .Write();
}

部分視圖

RouteValueDictionary rvd = new RouteValueDictionary();
for (int i = 0; i < Model.Bars.Count; ++i)
{ rvd.Add("model[" + i + "]", Model.Bars[i]); }

<img src="@Url.Action("GenerateChart", rvd)" />

這樣做的問題是,即使模型對象包含它應包含的三個項目,這些也是空的。
我也嘗試使用ViewBag,如​​下所示:

ViewBag.BarA = Model.Bars.Select(m => m.BarA).ToArray();
ViewBag.BarB = Model.Bars.Select(m => m.BarB).ToArray();

在控制器方面

public void GenerateChart()
{
    var chart = new System.Web.Helpers.Chart(400, 200)
    .AddTitle("Title")
    .AddSeries(
        name : "name",
        xValue : ViewBag.BarA,
        yValues : ViewBag.BarB)
    .Write();
}

但是兩個數組都為空。 我也嘗試了一些不同的想法,但無法獲得所需的信息。

為了三重檢查(數據在視圖中顯示正常)數據是否正確,我將其更改為:

@{
    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

看來您不太了解MVC的工作原理。 我鼓勵您花一些時間瀏覽http://asp.net/mvc上的所有教程,以熟悉該框架。 即,似乎您正在嘗試采用很多方法,就像您在Web窗體領域一樣。 MVC是完全不同的野獸。

首先, Html.Action無法返回完整圖像,因為它要做的只是將返回值轉儲到正在生成的HTML中,並且您不能直接在HTML中嵌入二進制對象。

其次,即使可以 ,也不能將其用作img標簽的src src必須是一個字符串,即URL,指向圖像的位置。

因此,為了實現這一目標。 您將需要執行完整的操作,以將適當的響應作為圖像返回。 然后,您可以簡單地將圖像src鏈接到執行此操作的路由。

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="" />

現在,您只需鏈接到URL。 該URL映射到命中您的GenerateChart操作的路由,該路由然后返回實際圖像-就像您直接鏈接到物理圖像一樣。 現在,瀏覽器可以正確地將img標簽呈現到頁面上。

通過GET請求將復雜類型傳遞給操作在技術上是一件很血腥的事情,因此我不知道此解決方案是否適合您的需求,您可以按照以下方法進行操作;

Your action will recieve model as serialized string and you have to Deserialize it to your model

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");
}

Then you need to call your action via querystring like ?modelAsString={jsonData}我用於處理數據的示例URL: http://localhost:18681/Home/GenerateChart/?modelAsString=[{%22BarA%22:%22barAData%22,%22BarB%22:1.1},{%22BarA%22:%22barAData2%22,%22BarB%22:441.14},{%22BarA%22:%22barAData43%22,%22BarB%22:44.1}]

您應該通過序列化模型來創建<img> URL,該模型已准備好在使用<img>的頁面操作中顯示。

我已經測試了一個虛擬數據,您可以在下面看到輸出; 虛擬示例

PS:為了創建虛擬數據,我使用了以下方法;

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);
}

我也想知道是否有更有效的方法通過獲取請求來做到這一點。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM