我同意 TokenMacGuy 的观点,但有时这可能不可行。
在这种情况下,您将需要在视图可以绑定到的控制器中创建自定义类。然后,当您提交页面时,您可以使用 UpdateModel 获取值并重定向到另一个操作,再次传入模型以填充更多详细信息,或者为该视图传递新模型。
假设您有一个两页的向导。两个视图都继承自<MyApp.Controllers.Wizard>
.
在你的控制器中,你有一个类向导,它可能看起来像这样;
public class Wizard
{
string FirstName {get;set;}
string LastName {get;set;}
string eMail {get;set;}
}
电子邮件是在向导的第 2 步中捕获的。
在步骤 1 中,您有两个字段名称 FirstName 和 LastName,在回发时您只需使用 UpdateModel(Wizard object) 来获取值。
该模型现在确实有一个问题,因为您需要将整个模型传递给视图 2,包括视图 1 中不需要的数据。在视图 2 的回发中,您再次执行 UpdateModel(Wizard object) 以获取第 2 个字段,然后是电子邮件。
第二个视图中的名字和姓氏可能位于隐藏字段中。
这是一种方法,但现在我在屏幕上看到它确实不是最好的方法。您可以将每个步骤保存到状态服务中,这样您就不必每次都传回所有数据,这会使其更干净。
JamesShannon的想法也很棒。我认为除非您处于在线购买场景,否则向导已经过时了。
您可以做的是使用 JavaScript 隐藏和显示向导的元素,以便所有输入字段都位于同一页面上。如果您在完成上一部分时有一个滚动动画来打开下一部分,那么这会非常有效。
<script src="/Scripts/jquery-1.3.2.js"></script>
<script>
$(document).ready(function() {
$("#addComment").click(function() {
if ($("#divStep2").is(':visible')) {
$("#divStep2").slideUp(300);
} else {
$("#divStep2").slideDown(300);
}
});
});
</script>
上面的代码将在您单击时切换打开和关闭部分的动画。当然,这确实需要 JS 在客户端计算机上处于活动状态,因此您可能希望默认打开所有部分,然后使用 JS 在页面输入时关闭它们。
如果你这样做,那么如果用户确实有 JS,他们会看到漂亮的动画,如果没有,那么他们至少仍然会看到所有部分,生活会很美好。
我认为 JS 将是最好的方法,因为您不需要将不相关的数据传递到每个视图,也不需要将数据保存到某些状态服务,如果人们只是点击离开您的网站,您可能需要清理这些数据1/2 的方式通过。
希望这可以帮助。