2

同じviewModelで編集可能/読み取り専用フィールドを処理するためのベストプラクティスは何でしょうか。私はより大きなViewModelでこの問題に直面していますが、非常に単純なViewModelがあると仮定しましょう。

public class BaseListViewModel
{
    public int Id { get; set; }
    public bool IsCheckedForAction { get; set; }
    public string DisplayName { get; set; }
}

私のPartialView:

@model Wims.Website.ViewModels.Shared.BaseModelListViewModel
@using Wims.Website.Classes.Helpers.ExtentionMethods
<div class="dataDetail">
        <div>
            <div class="float-left">
                @Html.CheckBoxFor(model => model.IsCheckedForAction)
            </div>

            <div class="float-left">
                @Html.LabelFor(model => model.IsCheckedForAction, Model.DisplayName)


                @Html.GenerateSecureDataControls(w => w.Id)
            </div>
        </div>
    </div>
<div style="clear: both"></div>

明らかに、データを投稿するときに、DisplayNameは入力されません。いくつかの検証が失敗し、DisplayNameが欠落していると受け取ったデータを返すと仮定しましょう。

    [HttpPost]

public ActionResult Edit(BaseListViewModel stuff)
{
    if (ModelState.IsValid)
    {
        ...
        return View("Index");
    }
    return View(stuff);
}

私はこれを修正するいくつかの方法があることを知っています:

1)追加

  @Html.HiddenFor(model => model.DisplayName)

ビューでは、フィールドが1つしかない場合は問題ありませんが、表示専用フィールドが10ある場合はどうなりますか?

2)[HttpPost]のif(!Model.isValid)のデータを再クエリします。

3)TempDataにキャッシュできると思いますか?

これを行うための最良の方法は何ですか?ありがとう!

編集:検証が失敗した場合にデータを再クエリする必要を回避しようとしています

4

2 に答える 2

3

PRGパターンを使用します。GETアクションでViewModelをビルドするだけなので、よりドライになります。検証が失敗した場合は、GETにリダイレクトして、モデルの状態をtempdataから取得します。

この記事、http: //www.jefclaes.be/2012/06/persisting-model-state-when-using-prg.html、またはMVCContribhttps://github.com/mvccontrib/MvcContribからの属性/blob/master/src/MVCContrib/Filters/ModelStateToTempDataAttribute.cs、POSTとGETの間でModelstateを簡単に渡すことができます

于 2012-12-18T08:38:19.757 に答える
0

POSTアクションは、GETアクションと同じビューモデルの初期化を実行する必要があります。初期化コードをコントローラーの共通のプライベート関数に移動できます。これは、同じデータへの同時変更が原因で検証が失敗した場合、検証エラーが新しいデータとともにユーザーに表示されるためです。ビューで許可されている場合は、PRGパターンを使用することもできます。

于 2013-03-26T04:26:39.053 に答える