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";
  }
}

View に Person に関するデータを表示する場合は、特定のコントローラーにリクエストを送信します。この場合 (そしてわかりやすくするために)、このコントローラーを MainController と呼びます。これは Controllers フォルダーに配置され、MainController と呼ばれます。Index からデータを取得する Action を呼び出しましょう (アクションは実際には特殊なメソッドにすぎません)。ASP.NET MVC ルーティングの仕組みにより、サーバーへのパスはhttp://localhost/Main/Indexになります。コントローラー (「コントローラー」の名前を除く) と、アクションがパスを構成していることに注意してください。(もちろん、最初の部分はサーバー名です。)

コントローラーを見てみましょう - ここでは非常にシンプルにします。

public class MainController : Controller {

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

Index アクション内で行っていることは、ビュー (デフォルトではアクションと同じ名前) とそのビューに対応するモデルを返すことです。次に、ビューを作成する必要があります。

ここで重要なのは、コントローラーでビューに返されるモデルを厳密に型指定することです。この行でそれを行います (これは 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 にもう 1 つ追加する必要があります。

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

このアクションは、開発したばかりの他のアクションと非常によく似ています。ただし、これは (送信されているフォームから) person オブジェクトを取得し、コントローラーにそのオブジェクトで必要なことは何でも行う機会を与えます。これが完了したら、別のページにリダイレクトしたり、ページを再表示したり (エラーが発生した場合に便利です)、その他の操作を行うことができます。

繰り返しますが、これはNerdDinner チュートリアルですべてカバーされています (そしてそれ以上) 。それを読んでそれに従うことを強くお勧めします。

あなたが議論した AJAX-y の側面に関しては、前提は同じです (ただし、そこには JavaScript/jQuery の作業が少しあります)。ここでは説明しませんが、基本はNerdDinner チュートリアルにも記載されています。

これで始められることを願っています。私も最初に Web テクノロジーに取り組み始めたとき、少し戸惑ったことを覚えています。

于 2011-02-10T22:17:40.610 に答える