0

我一直对如何在 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 脚本,所以这就是为什么输入字段是我能想到的唯一方法。但它仍然感觉不对......也许不是,但我基本上想知道是否还有其他更“正确”的既定方式在视图和控制器之间传递值(两种方式)。应该改用查询字符串吗?如果是这样,它们在 html.beginform htmlhelper 中的外观如何?

此外,我在这里要做的是为我的应用程序启用上传可能性。我正在尝试使整个应用程序尽可能地成为“Ajaxy”。但是这个表格将成为一个完整的帖子。是否有另一种方法可以做到这一点,而不必为此上传重新加载整个页面?

4

1 回答 1

1

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

为了解决您关于数据如何从视图传递到控制器并返回的具体问题,有几种方法可以做到这一点。然而,对大多数人来说往往有意义的是使用强类型视图的想法。

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

public class Person {

  public string FirstName;
  public string LastName;

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

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

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

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>" %>

请注意“继承”属性,并注意您的 Person 模型构成了该属性。

现在,只需像往常一样对视图的其余部分进行编码。假设我们要显示当前的 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 教程中涵盖了所有内容(以及更多内容)。我强烈建议您阅读并遵循它。

至于您讨论的 AJAX-y 方面,前提仍然是相同的(尽管其中正在进行一些 JavaScript/jQuery 工作)。我现在不会深入探讨,但NerdDinner 教程也涵盖了基础知识。

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

于 2011-02-10T22:17:40.610 回答