2

つまり、コントローラーには、基本的に現在のモデルをコピーし、そのコピーに基づいて新しいビューを返すアクションがあります。これがコピーであることをユーザーに通知するために、ビューバッグを介して、コピーであることを示すメッセージを追加します。新しいビューをレンダリングするときに使用されているのは元のコピーではなく、元のビューであることに気付くまで、すべてが機能しているように見えましたが、メッセージが表示されるようにビューバッグが更新されています。

うーん、それが理解できるかどうかわからないので、私はいくつかの擬似コードでも私が何を意味するのかを示しようとします:

モデル

public class Model{
    [ScaffoldColumn(false)]
    [HiddenInput(DisplayValue = false)]
    public Guid Id { get; set; }

    public string Name { get; set; }
}

意見

<input type="submit" name="Copy" value="@_("Copy")"/>

コントローラ

public ActionResult Copy(model) {
    ViewBag.Message = _("This is a copy.");
    var clone = model.Clone();
    return View("Index", clone);
}

私はこれに頭を包み込むのに本当に苦労しているので、どんな助け/ヒント/ポインターも本当にありがたいです。

ああ、クローンが本当にクローンであることを確認するために、コードを数回ステップスルーしました。それらを区別する唯一のものはIdプロパティであり、それはコントローラーの新しいプロパティですが、ビューがレンダリングされると、古いプロパティに戻ります。

4

1 に答える 1

1

ModelStateHtmlHelpersは投稿されたデータを再利用することを好むため、クローンを返す前にコレクションをクリアする必要があります。

public ActionResult Copy(model) {
    ViewBag.Message = _("This is a copy.");
    var clone = model.Clone();
    ModelState.Clear();
    return View("Index", clone);
}

この記事でこの機能の詳細を読むことができます:モデルの変更を無視するASP.NETMVCポストバックとHtmlHelperコントロール

于 2012-10-05T08:23:50.997 に答える