扩展方法无法动态调度错误 - 我该如何解决?

时间:2012-11-17 15:40:17

标签: asp.net-mvc-3 asp.net-mvc-4

无法找到解决此问题的正确方法。

我正在使用[Serializable](MVC3期货)以获得具有单独视图的“向导”。这是我的控制器中要序列化的代码:

 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]的情况下切换到其他方式,但是我必须转换大量代码。有没有办法让这项工作?

2 个答案:

答案 0 :(得分:6)

扩展方法未识别方法,因为数据类型不匹配。 尝试施放为对象。

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

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

它会起作用。

答案 1 :(得分:4)

你可以打电话

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

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