簡體   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