对不起更深奥的问题,但我想知道如何处理控制器操作中的一些问题。
通常,我会这样做:
public ActionResult Page1 (MyViewModel model)
{
...
return View(model);
}
或者,如果我正在进行序列化,我可能会在Controller中尽早这样做:
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的代码。例如,如果我在另一个控制器中使用它,我现在无法在上述两种情况下使用它:
...
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
命名为model
或myData
以外的其他内容,则控制器将触发,但当我到达视图.cshtml
时,我将收到对象引用错误在那个单选按钮上。
我是MVC的新手。我可以在这两种情况下使用单独的视图模型(实际上,我认为使用Serialize我会在视图上出现另一个错误)?或者是否有其他方法可以实现这一目标,而无需重新执行所有代码?
如果这是非常简单的原谅我 - 有时你只是陷入了一个问题,你就不会在你面前看到一些东西。