【发布时间】:2023-03-07 11:43:02
【问题描述】:
我正在开发一个注册流程,用户来并填写 5 个页面来完成一个流程。我决定有多个视图和一个控制器和一个 ProcessNext 操作方法来一步一步地进行。每次调用 Process Next 时,它都会获取原始视图和下一个视图。由于每个视图都与自己的视图模型相关联,因此我创建了一个基本视图模型,所有视图特定的视图模型都来自该模型。现在的问题是,强制转换会引发异常。这是示例代码
基础视图模型
public class BaseViewModel
{
public string viewName;
}
个人视图模型
public class PersonalViewModel : BaseViewModel
{
public string FirstName;
// rest properties comes here
}
索引.cshtml
@Model PersonalViewModel
@using (Html.BeginForm("ProcessNext", "Wizard", FormMethod.Post, new { class = "form-horizontal", role = "form" }))
@Html.TextBoxFor(m => m.FirstName, new { @class = "form-control" })
<input type="submit" class="btn btn-default" value="Register" />
基本上,我在这里将视图与 PersonalViewModel 绑定
现在控制器中的 ProcessNext Action 方法是这样的。
public ActionResult ProcessNext(BaseViewModel viewModelData)
{
PersonalViewModel per = (PersonalViewModel) viewModelData;
}
这是失败并抛出类型案例异常,为什么?..
我的想法是只使用一种操作方法来转换所有这些派生的视图模型并发送到一个通用类进行验证和处理。请帮我解决这个问题。谢谢!
【问题讨论】:
-
因为
viewModelData不是PersonalViewModel您不能将基类型强制转换为派生类型。无论如何,这可能行不通,因为您发回BaseViewModel,所以与PersonalViewModel相关的所有内容都丢失了。 -
在基本的哎呀.. 我很高兴将基类类型转换为派生.. 对吗?.. 那么在这里可以做些什么来让它工作呢?有什么疯狂的猜测吗?
-
在第一步中,您的帖子返回到
public ActionResult Step1(PersonalViewModel model),它保存数据然后重定向到一个 GET 方法,该方法呈现您的Step2ViewModel视图,该视图返回到public ActionResult Step2(Step2ViewModel model)等。没有意义在BaseViewModel中,除了可能包含所有步进模型共有的ID属性 -
并且“我很适合将基类类型转换为派生.. 对吗?” 不,你不能那样做。但是你可以反过来做。
标签: asp.net asp.net-mvc casting viewmodel