0

呼び出されたときにfilecontentresultを作成するコントローラーがありますが、それを画像のソースに設定しようとすると、画像が表示されません。私はfirebugを使用してデバッグし、何かがビューに返されることを確認しましたが、それが有効であるとは思わないようです。

コントローラー

  [HttpPost]
    public ActionResult BespokeAnalysis(MemberModel model)
    {

        if (ModelState.IsValid)
        {
            var CostVariations = CostVariationRepository.GetAll();
            if (model.SelectedYears != null && model.SelectedTypes != null && model.SelectedCostTypes != null)
            {
                var variations = CostVariations.Where(m => model.SelectedYears.Contains(m.Year));
                variationresults = variations.Where(m => model.SelectedTypes.Contains(m.CategoryId)).ToList();
                selectedtypes = model.SelectedCostTypes.ToList();

            }
        }

return Json(new { chartUrl = Url.Action("CreateChart", "Member", new { chartType = SeriesChartType.Column, selectedtypes = selectedtypes, variationresults = variationresults }) });
    }

スクリプト:

  $(function () {
        $('form').submit(function () {

                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result) { 

                      $('#result').html(
                            $('<img/>', {
                                src: result.chartUrl,
                                alt: 'this is a super chart'
                            })
                        );

                    }
                });
                return false;

        });
    });

景色:

          <div id="slideleft" class="tslide">
          <div id="result"></div>
          <img id="image" src="" alt="none"/>
          @using (Html.BeginForm())
          {
          <div class="inner"><a href="#" class="toggle">Parameters</a>
             <div class="dropdowntoggle">
                <div class="buttonnarrow">Select</div>
                <div class="ui-widget-content">
                    @Html.CheckBoxListFor(model => model.SelectedSectors, new MultiSelectList(Model.Sectors, "Id", "Name", Model.SelectedSectors))                          
                </div>
             </div>
              </div>
             <input type="submit" value="Create" onfocus="this.blur()" class="createbutton"/>
          </div>
          }
       </div> 

   </div>

ActionResultを返すメソッド

    public ActionResult CreateChart(SeriesChartType chartType)
    {
        Chart chart = new Chart();
        chart.Width = 700;
        chart.Height = 400;
        chart.BackColor = Color.FromArgb(211, 223, 240);
        chart.BorderlineDashStyle = ChartDashStyle.Solid;
        chart.BackSecondaryColor = Color.White;
        chart.BackGradientStyle = GradientStyle.TopBottom;
        chart.BorderlineWidth = 1;
        chart.Palette = ChartColorPalette.BrightPastel;
        chart.BorderlineColor = Color.FromArgb(26, 59, 105);
        chart.RenderType = RenderType.BinaryStreaming;
        chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
        chart.AntiAliasing = AntiAliasingStyles.All;
        chart.TextAntiAliasingQuality = TextAntiAliasingQuality.Normal;



        foreach (var type in selectedtypes)
        {
            switch (type)
            {
                case 1:
                    foreach (var result in variationresults)
                    {
                        Dictionary<string, double> retVal = new Dictionary<string, double>();
                        retVal.Add("Stuff1", Math.Round(result.Stuff1, 3, MidpointRounding.ToEven));
                        chart.Series.Add(CreateSeries(retVal, result.Description + type, Color.Lavender, chartType));
                    }
                    break;
                case 2:
                    foreach (var result in variationresults)
                    {
                        Dictionary<string, double> retVal = new Dictionary<string, double>();
                        retVal.Add("Stuff2", Math.Round(result.Stuff2, 3, MidpointRounding.ToEven));
                        chart.Series.Add(CreateSeries(retVal, result.Description + type, Color.Aqua, chartType));
                    }
                    break;
                case 3:
                    foreach (var result in variationresults)
                    {
                        Dictionary<string, double> retVal = new Dictionary<string, double>();
                        retVal.Add("Stuff3", Math.Round(result.Stuff3, 3, MidpointRounding.ToEven));
                        chart.Series.Add(CreateSeries(retVal, result.Description + type, Color.Azure, chartType));
                    }
                    break;
                case 4:
                    foreach (var result in variationresults)
                    {
                        Dictionary<string, double> retVal = new Dictionary<string, double>();
                        retVal.Add("Stuff4", Math.Round(result.Stuff4, 3, MidpointRounding.ToEven));
                        chart.Series.Add(CreateSeries(retVal, result.Description + type, Color.Bisque, chartType));
                    }
                    break;
                    default:
                    foreach (var result in variationresults)
                    {
                        Dictionary<string, double> retVal = new Dictionary<string, double>();
                        retVal.Add("Crew Other", Math.Round(result.Crew_Other, 3, MidpointRounding.ToEven));
                        chart.Series.Add(CreateSeries(retVal, result.Description + type, Color.Lavender, chartType));
                    }
                    break;
            }


        }

        chart.ChartAreas.Add(CreateChartArea());

        using (var ms = new MemoryStream())
       {
           chart.SaveImage(ms, ChartImageFormat.Png);
           ms.Seek(0, SeekOrigin.Begin);

           return File(ms.ToArray(), "image/png", "Variations.png");
       }                      
    }

どんな助けでもありがたいです。

4

1 に答える 1

0

あなたの質問には不要なノイズが多すぎます。簡単にするために、この Chart クラスの使用方法の例を示します。

私は、いくつかの醜いMemoryStreamsを使用する代わりに、チャートをレスポンスにレンダリングするカスタムActionResultを書くことから始めます(つまり、FileResultクラスに渡す前に、より近くに処分したり、最初に移動したりしません)。

public class ChartResult : ActionResult
{
    private readonly Chart chart;
    public ChartResult(Chart chart)
    {
        this.chart = chart;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var httpContext = context.RequestContext.HttpContext;
        var response = httpContext.Response;
        response.ContentType = "image/png";
        chart.SaveImage(response.OutputStream, ChartImageFormat.Png);
    }
}

次に、コントローラーを作成できます。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult GetChartUrl()
    {
        return Json(new { chartUrl = Url.Action("Chart") });
    }

    [OutputCache(Duration = 0, Location = OutputCacheLocation.None)]
    public ActionResult Chart()
    {
        var chart = BuildChart();
        return new ChartResult(chart);
    }

    private Chart BuildChart()
    {
        Chart chart = new Chart();
        chart.Width = 700;
        chart.Height = 400;

        var series = new Series("Some stuff")
        {
            ChartType = SeriesChartType.Line,
            ChartArea = "MyArea"
        };
        for (int i = 0; i < 100; i++)
        {
            series.Points.AddXY(i, 3 * i);
        }
        chart.Series.Add(series);
        chart.ChartAreas.Add("MyArea");
        return chart;
    }
}

そして最後にビュー:

@using (Html.BeginForm("GetChartUrl", null))
{
    <button type="submit">Submit this form using AJAX and show chart dynamically</button>
}

<script type="text/javascript">
    $('form').submit(function () {
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (result) {
                $('#image').html(
                    $('<img/>', {
                        src: result.chartUrl,
                        alt: 'this is a super chart'
                    })
                );
            }
        });
        return false;
    });
</script>

<div id="image"></div>
于 2013-02-05T11:13:10.450 に答える