无法找到解决此问题的正确方法。
我正在使用[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]
的情况下切换到其他方式,但是我必须转换大量代码。有没有办法让这项工作?
答案 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(...)
它在没有扩展方法语法的情况下调用扩展方法。