11

これが基本的な質問かもしれないと感じています!

複雑なオブジェクト、つまり他のオブジェクトのリストであるプロパティを含むドキュメントオブジェクトがあります。これは、一部のXMLを逆シリアル化することによって作成されました。

モデル全体をビューに渡したい

Return ViewResult(MyDoc)

ビューでは、いくつかのプロパティが編集されます。その後、制御はPostControllerに戻されます。

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(Document myDoc)

「myDoc」は、フォームのフィールドを表すだけです。これはModelBindingが機能していると思われます。したがって、複雑なオブジェクトを非表示フィールド(例は素晴らしい)に永続化するか、セッションオブジェクトとして永続化する必要があると思います。ただし、更新されたフィールドが永続化されたオブジェクト(非表示またはセッション)にマージされる方法については少し混乱しています。

4

2 に答える 2

5

その大きなオブジェクトをビューに保存することは完全に必要ですか?

はそのViewコンテンツを制御できないようです。そのため、おそらくすべてのデータをに送信したくないでしょうView。に基づいた考え方を適用しているようですがViewState、MVC、IMHOにはあまり適合していません。

Viewとの間の通信は、をController介して行われますViewModels。通常、サーバーと対話するときに、大きなシリアル化されたデータを保存して、データをやり取りする必要はありません。

ViewModelビュー(フィールド)に役立つデータのみを表すを作成し、 POST中にAction受信してそのデータを取得しViewModel、その後、ビューから取得した情報をXMLからロードした情報と同期することはできません。その時だけ?

于 2012-11-23T02:23:32.117 に答える
3

そうです、これは実際のモデルバインディングです。

次のようなHtmlHelpersを使用すると、バインディングはほぼ自動的に発生します。

@Html.TextboxFor(model => model.PropertyName)

この行は実際には次のようなものを少し作成します:

<input type="textbox" id="Modelobject_PropertyName" name="ModelObject.PropertyName" />

次に、フォームを送信するDefaultModelBinderと、POST値を逆シリアル化し、指定されたタイプのオブジェクトを作成して作成できます(少なくとも試行します)。対応するエントリが見つからない場合、プロパティはnullになり、エントリの場合はnullになります。対応するプロパティがない場合、無視されます(他のパラメータがない場合)。

この記事は少し古いものですが、それでもかなり正確です。

例として:

単純なオブジェクトがあるとしましょう:

public class IndexModel
{
    public string MyProperty { get; set; }
    public bool MyCheckbox { get; set; }
}

シンプルなコントローラー:

public class TestingController : Controller
{
    [OutputCache(Duration=0, NoStore = true)]
    public ActionResult Index()
    {
        return View(new IndexModel { MyProperty = "hi" });
    }

    [HttpPost]
    [OutputCache(Duration=0, NoStore = true)]
    public ActionResult Index(IndexModel model)
    {
        model.MyProperty += "!";
        ModelState.Clear();
        return View(model);
    }
}

そして簡単なビュー:

@model MvcApp.Models.IndexModel

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(model => model.MyProperty)<p />
        @Html.TextBoxFor(model => model.MyProperty) 
    </div>
    <div>
        @Html.LabelFor(model => model.MyCheckbox)<p />
        @Html.CheckBoxFor(model => model.MyCheckbox)
    </div> 

    <input type="submit" />
}

フォームを送信すると、モデルが完全に再作成されていることがわかります。

プロパティの実際の値を表示したくないが、それでも永続化する必要がある場合:

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

これにより、ポストバックされて永続化される非表示フィールドが生成されます。

ハッピーコーディング!

于 2012-11-23T02:27:57.423 に答える