1

私のビューの 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();
    ....
4

2 に答える 2

1

全体的なアプローチには疑問があると思います。

オブジェクトの編集状態を積極的に管理することを検討している場合は、おそらく、より堅牢な ajax ソリューションが必要です。

私は個人的に「focusOut」バインディングを行い、focusOut 時に一意のアクションを呼び出して、そのステータスとそのステータスのみを更新します。

これには、プロジェクトに追加できない、または追加しない追加のアーキテクチャ オーバーヘッドが必要になる場合がありますが、より柔軟になります。

于 2013-05-23T16:23:46.633 に答える
0

エンティティ クラスから独立した ViewModel が必要です。コントローラーでは、必要なエンティティに必要なすべての更新を提供する必要があります。

于 2013-05-23T16:26:33.650 に答える