0

より難解な質問で申し訳ありませんが、コントローラーのアクションで発生した一種の問題を処理する方法を知りたいです。

通常、私はこれを行います:

public ActionResult Page1 (MyViewModel model)
{
...
return View(model);
}

または、シリアル化する場合は、コントローラーの早い段階でこれを行うことがあります。

private MyViewModel myData ;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var serialized = Request.Form["myData"];
    if (serialized != null)
    {
        myData = (MyViewModel)new MvcSerializer()
            .Deserialize(serialized, SerializationMode.Signed);
        TryUpdateModel(myData);
    }
    else
        myData  = (MyViewModel)TempData["myData"] 
            ?? new MyViewModel();
        TempData.Keep();
    }
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.Result is RedirectToRouteResult)
        TempData["myData"] = myData;
}

そして、私の ActionResult でこれを行うことができます:

public ActionResult Page2 (string this, string that)
{
...
return View(myData);
}

しかし今、私は (どちらのシナリオでも) 何らかの方法で ViewModel を再構築するコードを挿入しようとしています。たとえば、これを別のコントローラーで使用した場合、上記の 2 つのシナリオでは機能しません。

...
var model = new MyViewModel
    {
        MyRequests = myRequests //defined earlier in ActionResult 
        //(e.g., part of a radio button list)
    };

上記を ActionResult のままにしておくと、機能しません (model衝突しmodelます)。これは、名前を変更しても当てはまりますmyData

代わりにしようとするとreturn new MyViewModel、変換エラーが発生します (ViewModel を ActionResult に変換できません)。

またはvar以外の名前を付けると、コントローラーが起動しますが、ビューに到達すると、そのラジオ ボタンでオブジェクト参照エラーが発生します。modelmyData.cshtml

私はMVCの初心者です。これら 2 つのシナリオで別のビュー モデルを使用できますか (実際、Serialize を使用すると、ビューで別のエラーが発生すると思います)。または、コードをすべてやり直すことなくこれを達成する他の方法はありますか?

それが本当に単純なことなら許してください - 時々、あなたは問題に巻き込まれ、目の前にあるものを見逃すことがあります.

4

0 に答える 0