在MVC中传递视图和控制器之间的值2

问题描述:

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

我发现是我可以用一个隐藏字段,然后[“名称”]这样的访问通过的Request.Form:

<% 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脚本,所以这就是为什么输入字段是我能想到的唯一方式。但它仍然感觉错了......也许它不是,但我基本上想知道是否有其他更“正确的”已建立的方式来传递视图和控制器之间的值(两种方式)。应该使用querystrings来代替吗?如果是这样,他们将如何看待html.beginform htmlhelper?

另外,我在这里要做的是为我的应用程序启用上传的可能性。我试图将整个应用程序尽可能地作为“Ajaxy”。但是这个表格会做一个完整的帖子。有没有其他的方法来做到这一点,而不必重新加载整个页面的上传?

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

若要解决您的数据如何从视图传递到控制器和回来的具体问题,有几种方法可以做到这一点。然而,对大多数人来说趋于合理的是使用强类型观点的想法。

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

public class Person { 

    public string FirstName; 
    public string LastName; 

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

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

让我们看看你的控制器 - 我要保持它很简单,现在:

public class MainController : Controller { 

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

什么,我们应该继续对指数内动作是它返回一个View(默认情况下,它与Action有相同的名称)和一个与该视图相对应的模型。现在,我们必须创造我们的观点。

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

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewUserControl<Project.Namespace.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中。

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