私は自分の仕事を解決しましたが、それがどのように機能するかが好きではありません。重すぎるようです。あなたが私にまったく同じことをするより良い方法を提案することができれば、それは素晴らしいでしょう!
だからここに私の苦痛があります:)私はビジネスデータを含むチャートを含むSQLDBのテーブルを持っており、それらは別の部門によって開発され、ランダムに追加されています(少なくとも私の観点から)。年の範囲は1995年から2012年(3)ですが、来月ごとに新しいデータが表示され、過去のデータを追加しようとするため、これらの日付はどちらも柔軟である必要があります。
これで、次のようになります。
この目標を達成するために、私はこのモデルを作成しました。
using System;
using System.Collections.Generic;
namespace MvcApplication1.Models
{
[Serializable]
public class MonthlyModel
{
public int TypeId { get; set; }
public List<YearDTO> Items { get; set; }
}
[Serializable]
public class YearDTO
{
public DateTime Year { get; set; }
public MonthDTO January { get; set; }
public MonthDTO February { get; set; }
public MonthDTO March { get; set; }
public MonthDTO April { get; set; }
public MonthDTO May { get; set; }
public MonthDTO June { get; set; }
public MonthDTO July { get; set; }
public MonthDTO August { get; set; }
public MonthDTO September { get; set; }
public MonthDTO October { get; set; }
public MonthDTO November { get; set; }
public MonthDTO December { get; set; }
}
[Serializable]
public class MonthDTO
{
public DateTime start { get; set; }
public DateTime end { get; set; }
public int priceTypeId { get; set; }
public bool IsEnabled { get; set; }
public bool IsSelected { get; set; }
}
}
これは、上記のようにビューを表示するGetMethodと、このモデルを元に戻して解析し、グラフを使用して別のビューを作成するPostメソッドを含むコントローラーです。
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class HistoricalController : Controller
{
[HttpGet]
public ActionResult Monthly()
{
int typeId = -1;
try
{
typeId = Convert.ToInt32(RouteData.Values["id"]);
}
catch (Exception)
{
}
MonthlyModel mm;
if (Session[String.Format("MonthlySelect{0}", typeId)] != null)
{
mm = (MonthlyModel)Session[String.Format("MonthlySelect{0}", typeId)];
}
else
{
mm = GetMonthlyModel(typeId);
}
return View(mm);
}
private MonthlyModel GetMonthlyModel(int typeId)
{
MonthlyModel mm = new MonthlyModel();
var list = ChartManager.GetAvailableMonthlyCharts(typeId, 1, 3, new DateTime(1995, 1, 1), DateTime.Today);
foreach (Tuple<DateTime, DateTime, bool, int> val in list)
{
var start = val.Item1;
var end = val.Item2;
var exists = val.Item3;
var pti = val.Item4;
var items = mm.Items ?? (mm.Items = new List<YearDTO>());
int idx = items.FindIndex(f => f.Year.Year == start.Year);
if (idx == -1)
{
items.Add(new YearDTO { Year = new DateTime(start.Year, 1, 1) });
idx = items.FindIndex(f => f.Year.Year == start.Year);
}
switch (start.Month)
{
case 1:
items[idx].January = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 2:
items[idx].February = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 3:
items[idx].March = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 4:
items[idx].April = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 5:
items[idx].May = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 6:
items[idx].June = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 7:
items[idx].July = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 8:
items[idx].August = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 9:
items[idx].September = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 10:
items[idx].October = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 11:
items[idx].November = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
case 12:
items[idx].December = new MonthDTO { start = start, end = end, priceTypeId = pti, IsEnabled = exists, IsSelected = false };
break;
}
}
mm.metalId = typeId;
return mm;
}
[HttpPost]
public ActionResult MonthlyCharts(MonthlyModel model)
{
List<ChartDTO> list = new List<ChartDTO>();
foreach (YearDTO dto in model.Items)
{
var val = dto.January;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.February;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.March;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.April;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.May;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.June;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.July;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.August;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.September;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.October;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.November;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
val = dto.December;
if (val.IsSelected) list.Add(ChartManager.GetChart(val.start, val.end, model.metalId, 1, val.priceTypeId));
}
Session[String.Format("MonthlySelect{0}", model.metalId)] = model;
ModelState.Clear();
return View(list);
}
}
}
そして最後の部分は、実際にはこのチェックボックスフィールドを表すビューです。
@model MvcApplication1.Models.MonthlyModel
@{
ViewBag.Title = "Monthly charts ";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@(ViewBag.Title)</h2>
<div id="choice-container">
@using (Html.BeginForm("MonthlyCharts", "Historical", FormMethod.Post))
{
@Html.TextBox("metalId", Model.metalId, new { @type = "hidden" })
<table>
<tr>
<th> Year</th>
<th> January</th>
<th> February</th>
<th> March</th>
<th> April</th>
<th> May</th>
<th> June</th>
<th> July</th>
<th> August</th>
<th> September</th>
<th> October</th>
<th> November</th>
<th> December</th>
<th> </th>
</tr>
@for (int i = 0; i < Model.Items.Count(); i++)
{
<tr>
<td>
@Html.Label("Items[" + i + "].Year", Model.Items[i].Year.ToString(@"yyyy"))
@Html.TextBox("Items[" + i + "].Year", Model.Items[i].Year, new { @type = "hidden" })
</td>
<td>
<div align=center class="editor-field">
@if (Model.Items[i].January.IsEnabled)
{
@Html.CheckBox("Items[" + i + "].January.IsSelected", Model.Items[i].January.IsSelected, new { @class = "chk" })
}
else
{
@Html.CheckBox("Items[" + i + "].January.IsSelected", Model.Items[i].January.IsSelected, new { @disabled = "disabled" })
}
@Html.TextBox("Items[" + i + "].January.IsEnabled", Model.Items[i].January.IsEnabled, new { @type = "hidden" })
@Html.TextBox("Items[" + i + "].January.start", Model.Items[i].January.start, new { @type = "hidden" })
@Html.TextBox("Items[" + i + "].January.end", Model.Items[i].January.end, new { @type = "hidden" })
@Html.TextBox("Items[" + i + "].January.priceTypeId", Model.Items[i].January.priceTypeId, new { @type = "hidden" })
</div>
</td>
@*
.... 11 times ....
*@
</tr>
}
</table>
<input type="submit" class="button" value="Get the image"/>
}
</div>
したがって、ユーザーは、チャートがある場合にのみ、年の月を選択できます。年の範囲は将来変更される可能性があります。別のページにチャートを表示する必要があります。ユーザーが戻ってさらに数か月を選択することにした場合は、モデルを覚えておく必要があります(セッション中に保持します)。
したがって、このソリューションで私が気に入らない点は次のとおりです。1.モデルは重く、使用しにくく、作成および解析できません。新しいパラメータを追加するのは簡単ではありません。2.モデルのため、ビューには多くの非表示フィールドが含まれています。3.モデルの作成と解析を除いて、コントローラーは問題ありません。
私はWeb開発者としてはかなり新しいですが、ソフトウェア開発の初心者ではないので、可能であれば見栄えを良くしたいと思っています。
ここで何かが足りないと本当に感じています。私はあなたのアイデア、提案、そしてこのコードを単純化することができる何かに感謝します。ありがとう!
アップデート:
なぜこれほど多くのパラメータを使用するのかを明らかにしたいと思います。各グラフには開始DateTimeと終了DateTime(月末と月の始まり)とTypeIdがあるため、DateTimeを1つだけ使用することはできません。さらに、どういうわけか、ビュー内のテーブルを作成し、各コントロールを適切な場所に配置する必要があります。今、私はこの目的のために月の名前を使用しています。また、ビュー側でコントロールが有効になっていることを知る必要があり(ユーザーが選択できる場合)、POSTメソッドでどちらが選択されているかを知る必要があるため、bool IsEnabled {get; セットする; }およびboolIsSelected{get; セットする; }およびその他のパラメータ。