在MVC中传递参数的设计建议

问题描述:

如何在两个视图中传递ASP.net MVC中的参数,如向导?在MVC中传递参数的设计建议

或什么是最好的做法?

我上的bug跟踪点播应用ASP.net工作被转移到MVC,我似乎无法撼动的ASPX了我的头,并在原地打算。

在ASPX应用程序中。

1页 - >选择项目,通过专案编号在查询字符串
第2页 - >选择问题类型,通过专案编号和问题类型的查询字符串
第3页 - >创建新问题,我们可以得到专案编号和问题类型的形式查询字符串

我们如何在MVC中重新创建上述流程?

+0

你想用'a'标签链接或表单(可能选择)元素来做到这一点? – Charlino 2009-07-07 03:14:23

+0

您能否解释一下使用'a'标签链接或表单的不同之处。 – Picflight 2009-07-07 16:14:32

为“向导”型系统的常见做法是使用一个单一的<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接口,其中来自其他工具的单个页面请求可以生成表单的所有输入,跳过中间向导页面。

的缺点是,由于该页面动态生成基于用户请求,客户端都会有,如果他们碰巧导航离开该页面重新开始。书签不起作用。它也不会在验证中保存任何东西,因为这种表单输入可能很容易被伪造。

+0

你可以请参考一个例子,说明如何用单个元素

完成这个任务。 – Picflight 2009-07-07 16:15:23

我同意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路。

希望这会有所帮助。

+0

是的,样品会非常有帮助。 – Picflight 2009-07-07 13:37:53

就个人而言,我更喜欢griegs'的解决方案。我自己做了这个,它更干净。此外,当需求发生变化,并有可以来回移动的页面之间,或保存状态,稍后再回来的请求,则该模型是唯一的出路。

但是...如果你的例子是不做作,你的精灵真的是象你所说的那么简单,那么我建议:

一)重新考虑你的第3页向导想法。四年前,这将是一条路要走,但现在我们有AJAX。将它合并到一个页面上。

B)做不到这一点......通过表单传递2个变量(我喜欢这里查询字符串)。

詹姆斯

对于特定向导的情况,有一个非常酷的JQuery的向导插件可以在这里找到:

http://blog.jerodsanto.net/2008/08/jquery-wizard-redux/

演示是在这里:

http://jerodsanto.net/src/wizard/demo/