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”没有名为“隐藏”的适用方法,但似乎具有该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或在没有扩展方法语法的情况下调用扩展方法。

我可以在没有 的情况下切换到其他方式[Serializable],但是我必须转换很多代码。有什么办法可以使这项工作?

4

2 回答 2

7

扩展方法没有识别方法,因为数据类型不匹配。尝试转换为对象。

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

或者

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

它会起作用。

于 2014-02-19T07:02:45.910 回答
4

你可以打电话

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

而不是 @Html.Hidden(...) 它正在调用没有扩展方法语法的扩展方法。

于 2012-11-17T16:00:52.460 回答