私のビューの 1 つは、4 つの異なるエンティティ クラスのオブジェクトを 0 個から多数個提示します。
私の目標は、4 つのエンティティ タイプすべてに共通する 1 つの値を簡単に編集できるようにすることです。
ビュー全体に対して送信ボタンは 1 つしかありません。この送信ボタンは、すべての編集可能な値に加えられた変更が次のように保存される ActionResult を呼び出します (注意: 署名が無効であるように見えるため、これは機能しません)。
public ActionResult SaveBloombergTickers(IEnumerable<StockPosition> stockpositions, IEnumerable<BondPosition> bondposition, ...)
{
if (ModelState.IsValid)
{
foreach (var stockposition in stockpositions)
{
db.Entry(stockposition).State = EntityState.Modified;
db.SaveChanges();
}
foreach (var bondposition in bondpositions)
{
db.Entry(bondposition).State = EntityState.Modified;
db.SaveChanges();
}
return RedirectToAction("Index");
}
return View("Index");
}
質問 1 : これは、私が望むことを達成するためのばかげた方法だと思います。残念ながら、これに関する「ベスト プラクティス」については知りません。あなたは?
質問 2 : この場合、ActionResult の有効な署名はどのようになりますか?
解決策(アイデアを提供してくれたDavid Lに感謝します):
1)ビューを作成するときに、必要なデータ (現在の要素の ID) をテキスト ボックスに添付します。
<input type="text" class="updateBloombergTicker StockPosition"
data-key="@stockposition.StockPositionID" style="width: 100px;"
value="@stockposition.BloombergID"/>
2)テキストボックスのぼかしで、対応するAjax-Eventを起動し(そのために「AJAX」関数を使用します)、必要な情報をコントローラーに渡します:
$(".updateBloombergTicker").blur(function () {
$this = $(this);
if ($this.hasClass("StockPosition")) {
AJAX("../Excel/UpdateStockPositionTicker",
{
key: $this.attr("data-key"),
ticker: $this.val()
}
);
}
if ($this.hasClass("BondPosition")) {
.......
3)コントローラーが残りを行います。
[HttpPost]
public ActionResult UpdateStockPositionTicker(string key, string ticker)
{
if (ModelState.IsValid)
{
var stockposition = db.StockPositions.Find(Convert.ToInt32(key));
stockposition.BloombergID = ticker;
db.SaveChanges();
....