3

この問題の適切な解決策が見つかりません。

[Serializable]個別のビューを持つ「ウィザード」を使用するために、(MVC3 Futures) を使用しています。シリアル化するコントローラーのコードは次のとおりです。

 private MyViewModel myData;
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var serialized = Request.Form["myData"];
            if (serialized != null) //Form was posted containing serialized data
            {
                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;
        }

さらに、コントローラーで次のようなことを行います(単なるスニペット-コードは、次へボタンと戻るボタンの文字列でウィザードを通過します):

public ActionResult Confirm(string backButton, string nextButton)
        {
            if (backButton != null)
                return RedirectToAction("Details");

            else if ((nextButton != null) && ModelState.IsValid)
                return RedirectToAction("Submitted");
            else
                return View(myData);
        }

私の.cshtml見解では、私はこれを持っています:

@using (Html.BeginFormAntiForgeryPost())
    { 
         @Html.Hidden("myData", new MvcSerializer().Serialize(Model, SerializationMode.Signed))
    ...
         @Html.TextBoxFor(m => model.Step.EMail)
    ...
    }

ダイナミクスを使用しているため、代わりにビューで変数を使用する必要があります。

var model = (MyViewModel) Model.myData;

上記を行うため@Html.TextBoxForです。そして、ここに私の問題@model MyViewModelがありますmodel.Step.EMail。しかし、ダイナミクスのため、@Html.Hiddenは機能せず、次のエラーが発生します。

コンパイラ エラー メッセージ: CS1973: 'System.Web.Mvc.HtmlHelper' には 'Hidden' という名前の適用可能なメソッドがありませんが、その名前の拡張メソッドがあるようです。拡張メソッドは動的にディスパッチできません。動的引数をキャストするか、拡張メソッド構文を使用せずに拡張メソッドを呼び出すことを検討してください。

なしでこれを行う別の方法に切り替えることができますが[Serializable]、その場合、多くのコードを変換する必要があります。これを機能させる方法はありますか?

4

2 に答える 2

4

あなたは呼び出すことができます

@(InputExtensions.Hidden(Html, "myData", new MvcSerializer().Serialize(Model, SerializationMode.Signed)))

代わりに @Html.Hidden(...) 、拡張メソッド構文なしで拡張メソッドを呼び出しています。

于 2012-11-17T16:00:52.460 に答える