在MVC 2中传递View和Controller之间的值

时间:2010-08-17 23:01:06

标签: ajax asp.net-mvc-2 parameters html.beginform

我经常对如何在MVC中的视图和控制器之间传递值感到困惑。我知道我可以在Controller中设置ViewData并在View中使用它,但是反过来呢?

我发现的是我可以使用隐藏字段然后通过Request.Form [“name”]访问它,如下所示:

<% using (Html.BeginForm("Upload", "Customers", FormMethod.Post, new { enctype = "multipart/form-data" }))
   {%>
<br />
<input id="currentDir" type="hidden" name="currentDir" value="" />
<input type="file" name="fileTextbox" id="fileTextbox" />
<br />
<br />
<input type="submit" value="Send" />
<% } %>

更令它复杂化的是,这个值最初来自一个jquery脚本,所以这就是为什么输入字段是我能想到的唯一方法。但它仍然感觉不对......也许它不是,但我基本上想知道是否还有其他更“正确”的方法来在View和Controller之间传递值(两种方式)。应该使用querystrings吗?如果是这样,他们将如何看待html.beginform htmlhelper?

另外,我在这里要做的是为我的应用程序启用上传功能。而我正在努力使整个应用程序成为“Ajaxy”。但是这个表格将完整的帖子。有没有其他方法可以执行此操作而无需为此上载重新加载整个页面?

1 个答案:

答案 0 :(得分:1)

让我们暂时忽略“AJAX-y”方面(因为这是一个不同的问题),只看看在视图和控制器之间传递数据。我首先建议您查看NerdDinner Tutorial,它提供了一些关于MVC如何工作以及如何使用MVC的一些功能的很好的见解。

要解决有关如何将数据从View传递到Controller并返回的特定问题,有几种方法可以执行此操作。但是,对大多数人来说有意义的是使用强类型视图的想法。

假设您有一个名为Person的模型。现在,不要担心我们如何存储Person数据 - 我们在MVC项目的Models文件夹中只有一个Person类。

public class Person {

  public string FirstName;
  public string LastName;

  public Person() {
    FirstName = "John";
    LastName = "Doe";
  }
}

当我们想要在View中显示有关Person的数据时,我们向特定控制器发出请求。在这种情况下(为了清楚起见),我们将此控制器称为MainController。这将进入Controllers文件夹,并将被称为MainController。让我们调用Action(一个动作实际上只是一个专门的方法)我们想要从Index获取数据。由于ASP.NET MVC路由的工作原理,我们服务器的路径为:http://localhost/Main/Index。注意Controller(减去“Controller”名称),Action组成路径。 (当然,第一部分是您的服务器名称。)

让我们来看看你的控制器 - 我现在要保持它非常简单:

public class MainController : Controller {

  public ActionResult Index() {
    Person person = new Person();
    return View(person);
  }
}

我们在Index Action中发生的是它返回一个View(默认情况下,它与Action具有相同的名称)和一个与该视图对应的模型。现在,我们必须创建我们的视图。

这里的重要部分是您要强烈键入控制器中返回的模型到您的视图。你可以使用这一行(这是你的aspx文件中的第一行)。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewUserControl<Project.Namespace.Person>" %>

注意“Inherits”属性并注意您的Person模型构成该属性。

现在,只需正常编写视图的其余部分。假设我们要显示当前的人名,并允许某人更改名称。页面看起来像这样(我不是很漂亮):

<% using (Html.BeginForm()) { %>
  <%: Html.LabelFor(model => model.FirstName) %>
  <%: Html.TextBoxFor(model => model.FirstName) %>
  <%: Html.LabelFor(model => model.LastName) %>
  <%: Html.TextBoxFor(model => model.LastName) %>

  <input type="submit" value="Submit" name="submitButton" />
<% } %>

这是在控制器和视图之间来回获取数据的重要部分。我们在这里做的是我们正在使用强类型视图(使用Person类键入)并使用辅助方法(如LabelFor和TextBoxFor)将模型与其数据绑定在一起,最终与操作一起包含在控制器中(我们必须在一瞬间完成开发)。

所以,你现在可以看到数据了。但是,如果用户更改名称并单击提交 - 我们希望页面显示新名称。这意味着我们需要向MainController添加一个动作 - 接收数据的动作。

[HttpPost]
public ActionResult Index(Person person) {
  // Do whatever you want with the Person model. Update a database, or whatever.
  return View(person);
}

此操作与我们刚刚开发的其他操作非常相似。然而,这个获取一个人对象(来自正在提交的表单),它使控制器有机会做任何需要对该对象做的事情。完成此操作后,您可以选择重定向到其他页面,重新显示页面(如果有错误,则非常有用),或者执行任何其他操作。

同样,NerdDinner Tutorial中涵盖了这一点(以及更多内容)。我强烈建议你阅读并完成它。

至于你讨论的AJAX-y方面,前提仍然是相同的(虽然有一些JavaScript / jQuery工作在那里继续)。我现在不再讨论它,但NerdDinner tutorial中也介绍了基础知识。

我希望这能让你开始。我记得当我第一次开始使用网络技术时也有点困惑,所以我希望这可以帮助你!