繁体   English   中英

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

[英]Passing values between View and Controller in MVC 2

我一直对如何在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”。 但是此表格将提供完整的帖子。 还有另一种方法可以执行此操作,而不必为此上传重新加载整个页面吗?

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

为了解决有关如何将数据从View传递到Controller以及传递回Controller的特定问题,有几种方法可以做到这一点。 但是,对大多数人来说更有意义的是使用强类型视图的想法。

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

public class Person {

  public string FirstName;
  public string LastName;

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

当我们想在视图中显示有关Person的数据时,我们向特定的控制器发出请求。 在这种情况下(为了清楚起见),我们将此控制器称为MainController。 这将进入Controllers文件夹,并将其称为MainController。 我们称要从索引中获取数据的动作(动作实际上只是一种专门的方法)。 由于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" />
<% } %>

这是关于在Controller和View之间来回传输数据的重要部分。 我们在这里所做的是,我们采用您的强类型视图(使用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技术时也会有些困惑,所以希望这对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM