在MVC中传递参数的设计建议
如何在两个视图中传递ASP.net MVC中的参数,如向导?在MVC中传递参数的设计建议
或什么是最好的做法?
我上的bug跟踪点播应用ASP.net工作被转移到MVC,我似乎无法撼动的ASPX了我的头,并在原地打算。
在ASPX应用程序中。
1页 - >选择项目,通过专案编号在查询字符串
第2页 - >选择问题类型,通过专案编号和问题类型的查询字符串
第3页 - >创建新问题,我们可以得到专案编号和问题类型的形式查询字符串
我们如何在MVC中重新创建上述流程?
为“向导”型系统的常见做法是使用一个单一的<form>
元件,与来自隐藏字段前面的屏幕信息。
编辑:每个请求,这里是一个例子(我不熟悉ASP.net,所以你必须要转换成代码自己:(这)如果你有销售汽车网站和in。您的订购表格首先你问的模型车,并在随后的屏幕为您提供适用于该车辆的选择。
<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接口,其中来自其他工具的单个页面请求可以生成表单的所有输入,跳过中间向导页面。
的缺点是,由于该页面动态生成基于用户请求,客户端都会有,如果他们碰巧导航离开该页面重新开始。书签不起作用。它也不会在验证中保存任何东西,因为这种表单输入可能很容易被伪造。
你可以请参考一个例子,说明如何用单个元素
我同意TokenMacGuy但有时可能并不可行。
在您将需要在创建自定义的类这种情况下,说你的控制器,你的观点可以绑定到。然后,在您提交页面时,您可以使用UpdateModel获取值并重定向到另一个传递给模型的动作,以再次填充更多细节或为该视图创建新模型。
让我们假设你有一个两个向导。这两个视图都继承自<MyApp.Controllers.Wizard>
。
在你的控制器中你有一个类向导,它可能看起来像这样;
public class Wizard
{
string FirstName {get;set;}
string LastName {get;set;}
string eMail {get;set;}
}
电子邮件是在你的向导的步骤2捕获。
在步骤1中,您有两个字段名称名字和姓氏,并在回发,你只需使用的UpdateModel(向导对象)来获得的值。
这种模式确实现在有一个问题,你需要将整个模型传递给View 2,其中包含从视图1中不需要的数据。在View 2的后面,您再次执行UpdateModel(Wizard对象)以获得前两个字段,然后再获取电子邮件。
第二个视图中的FirstName和LastName可能位于隐藏字段中。
这是1种方式,现在真的不是我在屏幕上看到的最好的。您可以将每一步都保存到状态服务中,这样您就不会每次都传回所有数据,这会使数据更清洁。
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路。
希望这会有所帮助。
是的,样品会非常有帮助。 – Picflight 2009-07-07 13:37:53
就个人而言,我更喜欢griegs'的解决方案。我自己做了这个,它更干净。此外,当需求发生变化,并有可以来回移动的页面之间,或保存状态,稍后再回来的请求,则该模型是唯一的出路。
但是...如果你的例子是不做作,你的精灵真的是象你所说的那么简单,那么我建议:
一)重新考虑你的第3页向导想法。四年前,这将是一条路要走,但现在我们有AJAX。将它合并到一个页面上。
B)做不到这一点......通过表单传递2个变量(我喜欢这里查询字符串)。
詹姆斯
对于特定向导的情况,有一个非常酷的JQuery的向导插件可以在这里找到:
http://blog.jerodsanto.net/2008/08/jquery-wizard-redux/
演示是在这里:
你想用'a'标签链接或表单(可能选择)元素来做到这一点? – Charlino 2009-07-07 03:14:23
您能否解释一下使用'a'标签链接或表单的不同之处。 – Picflight 2009-07-07 16:14:32