如何在两个视图中传递ASP.net MVC中的参数,如向导?
或者最佳做法是什么?
我正在研究一个内部错误跟踪ASP.net应用程序被转移到MVC,我似乎无法摆脱我的头脑中的ASPX并进入圈内。
在ASPX应用程序中。
Page1 - >选择Project,在Querystring中传递projectId 第2页 - >选择IssueType,在Querystring中传递projectId和Issuetype 第3页 - >创建新问题,我们可以获得projectId和IssueType形式的查询字符串
我们如何在MVC中重新创建上述流程?
答案 0 :(得分:4)
我同意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(向导对象)来获取值。
此模型现在确实存在一个问题,您需要将整个模型传递给View 2,包括视图1中不需要的数据。在View 2的后面,您再次执行UpdateModel(Wizard对象)得到前2个字段,然后是电子邮件。
第二个视图中的FirstName和LastName可能位于隐藏字段中。
这是1种方式,现在我在屏幕上看到它并不是最好的方式。您可以将每个步骤保存到状态服务中,这样您就不会每次都传回所有数据,这样可以使其更清晰。
JamesShannon的想法也很棒。我认为奇才太过时了,除非你是在线购买场景。
您可以使用JavaScript来隐藏和显示向导的元素,以便所有输入字段都在同一页面上。如果您在完成上一部分时有滚动动画来打开下一部分,这可能非常有效。 &lt; =希望有意义。
<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通过。
希望这有帮助。
答案 1 :(得分:3)
“向导”类型系统的一个常见做法是使用单个<form>
元素,其中隐藏字段中的先前屏幕信息。
编辑:根据请求,这是一个例子(我不熟悉ASP.net,所以你必须自己将其翻译成代码:()。假设你有一个销售汽车的网站,并在你的订购表格首先询问模型车,并在随后的屏幕中提供适用于该车辆的选项。
<form action="order-wizard.html" method="POST">
<!-- which step of the wizard are we on? -->
<input type="hidden" name="step" value="1" />
<!-- Get some info from the user for the first step of the wizard -->
<select name="Model">
<option value="Sedan">Sedan</option>
<option value="Coup">Coup</option>
<option value="Pickup">Pickup</option>
<option value="Van">Van</option>
</select>
<input type="submit" />
</form>
当用户选择模型并提交表单时,order-wizard.html
的控制器可以注意到step
选项为1,并且知道检查用户是否选择了模型。然后它生成一个这样的页面:(假设用户选择“拾取”)
<form action="order-wizard.html" method="POST">
<!-- which step of the wizard are we on? -->
<input type="hidden" name="step" value="2" />
<!-- Stored results from the previous stage of the wizard -->
<input type="hidden" name="Model" value="Pickup" />
<!-- Additional information for the wizard. More than one option can be
requested for each stage of the wizard. -->
<select name="Style">
<option value="Short Bed">Short Bed</option>
<option value="Long Bed">Long Bed</option>
<option value="Extended Cabin">Extended Cabin</option>
<option value="Dually">Dually</option>
</select>
<select name="Interior">
<option value="Cloth">Cloth</option>
<option value="Leather"> Leather </option>
</select>
<input type="submit" />
</form>
如果向导需要收集更多信息,可能会有隐藏输入以这种方式生成的其他页面。否则,如果这是最后一页并且收集了所有信息,则该页面的代码可以正常处理表单,就像用户在单个页面请求上提供了所有输入一样。
此技术的优点是服务器不需要缓存任何会话信息。另一个优点是它提供了一种RESTful接口,其中来自另一个工具的单个页面请求可以生成表单的所有输入,跳过中间向导页面。
缺点是,由于页面是根据用户请求动态生成的,因此如果客户端碰巧离开页面,则必须重新开始。书签不起作用。它也不会在验证中保存任何内容,因为这种表单输入可能很容易伪造。
答案 2 :(得分:0)
就个人而言,我更喜欢griegs的解决方案。我自己做了这件事,而且更干净了。此外,当需求发生变化并且要求您可以在页面之间来回移动,或保存状态并稍后返回时,那么模型是唯一的方法。
但是......如果你的例子没有做作,你的向导真的很简单,那么我会建议:
a)重新思考你的3页向导想法。四年前,这将是一条路......但现在我们有了AJAX。将它合并到一个页面上。
b)失败...通过表格传递2个变量(我更喜欢这里的查询字符串)。
詹姆斯
答案 3 :(得分:0)