设计建议在MVC中传递参数

时间:2009-07-07 01:12:35

标签: asp.net-mvc

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

或者最佳做法是什么?

我正在研究一个内部错误跟踪ASP.net应用程序被转移到MVC,我似乎无法摆脱我的头脑中的ASPX并进入圈内。

在ASPX应用程序中。

Page1 - >选择Project,在Querystring中传递projectId 第2页 - >选择IssueType,在Querystring中传递projectId和Issuetype 第3页 - >创建新问题,我们可以获得projectId和IssueType形式的查询字符串

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

4 个答案:

答案 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)

对于特定于向导的场景,这里有一个非常酷的JQuery向导插件:

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

演示在这里:

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