ASP.NetMVCビューからコントローラーにデータを渡す方法[クローズ]


81

私はASP.Netにまったく慣れていないので、これは非常に基本的な質問だと確信しています。レポートを生成するためのリンクがあるビューがありますが、レポートを生成できるようにするには、ユーザーに適切なテキスト名を入力するように依頼する必要があります。上手。

これまで、コントローラーからビューに渡されたモデルを使用してサーバーからビューにデータを渡すことができましたが、ビューからコントローラーにデータを渡す方法がわかりません。

この場合、ビューからコントローラーに文字列を渡す必要があります。

例を挙げたアドバイスをいただければ幸いです。

更新

データをサーバーにポストバックする必要があることは理解していますが、それはrazorhtmlコードとコントローラーの形でどのように実現されますか?


ユーザーは何かを投稿する必要があります-ビューはコントローラーと通信する方法を直接知りません。
ダニエルA.ホワイト

Microsoftのドキュメントを読むと、これを行う方法が説明されていないことがわかります。
ポールマッカーシー

回答:


133

コントローラからビューにデータを渡す方法のように、ViewModelsを使用してこれを行うことができます。

このようなビューモデルがあると仮定します

public class ReportViewModel
{
   public string Name { set;get;}
}

GETアクションでは、

public ActionResult Report()
{
  return View(new ReportViewModel());
}

そしてあなたの見解は強くタイプされなければなりません ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

そして、あなたの中HttpPostコントローラーでアクションメソッド

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

または単に、POCOクラス(Viewmodels)なしでこれを行うことができます

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

HttpPostアクションで、テキストボックス名と同じ名前のパラメーターを使用します。

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

編集: コメントによる

別のコントローラーに投稿する場合は、BeginFormメソッドのこのオーバーロードを使用できます。

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

アクションメソッドからビューにデータを渡しますか?

同じビューモデルを使用できます。GETアクションメソッドでプロパティ値を設定するだけです。

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

そしてあなたの見解では

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

提示したオプション/方法2(モデルなし)で、コントローラー名を指定する方法はありますか?このポストの要求を受けるべきコントローラは、このビューのコントローラよりも異なっているので...
アーメド

@Ahmed:更新された回答を確認してください。BeginFormメソッドの特定のオーバーロードを使用できます。
Shyju 2013

4
優れた、あなたの偉大な答えてくれてありがとう。..
アーメド

いいですね、私は今数時間を探していました。ありがとう!
ダンボーリュー2015

ありがとう!非常に明確な答え。私の場合、HttpPostアクションでは、テキストボックス名と同じ名前のパラメーターを使用する必要はありませんでした。モデルオブジェクトをパラメータとして入力するだけで、値を取得できます。
Hnin Htet Htet Aung 2017

27

投稿したくない/投稿する必要がない場合:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

新しい{}部分のreportIDはアクションパラメーターのreportIDと一致することに注意してください。この方法でパラメーターをいくつでも追加できますが、2または3を超えると(常に主張する人もいます)、POSTを介してモデルを渡す必要があります(他の答えによる)

編集:コメントで指摘されているように、正しいオーバーロードのためにnullを追加しました。いくつかのオーバーロードがあり、action + controllerの両方を指定する場合は、routeValuesとhtmlAttributesの両方が必要です。コントローラがない場合(キャプション+アクションのみ)、routeValuesのみが必要ですが、常に両方を指定することをお勧めします。


4
この簡単な答えに出くわした人には参考までに、ルート値を含めた後にnullを追加してください[new {reportID = 1}]。そうしないと、それらをhtmlAttributesとして取得しようとし、通過しません
Hardycore

22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

コントローラ:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}

1
<input type = "valueINeed" type = "text">は<inputname = "valueINeed" type = "text">である必要があります
GregH 2015

Thnx。応答を更新しました。
Azure SME
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.