web-dev-qa-db-ja.com

ASP.Net MVCビューからコントローラへデータを渡す方法

私は完全にASP.Netに不慣れで、これは私がレポートを生成するためのリンクがありますがレポートを生成することができるようにするビューを持っている非常に基本的な質問です。そうですね。

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

この場合は、ビューからコントローラに文字列を渡すだけです。

例を使ってアドバイスをいただければ幸いです。

UPDATE

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

64
Ahmed

ViewModelを使って、コントローラからビューにデータを渡す方法と同じようにできます。

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

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
}

OR単純に、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" />
}
111
Shyju

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

@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)
{

New {}部分のreportIDはactionパラメータのreportIDと一致します。このようにして任意の数のパラメータを追加できますが、2または3を超える数(常に議論されるものもあります)をPOST(他の回答によると)

編集:コメントで指摘されているように、正しいオーバーロードのためにnullを追加しました。たくさんのオーバーロードがあり、action + controllerの両方を指定した場合、routeValuesとhtmlAttributesの両方が必要になります。コントローラがなければ(単にキャプション+アクション)、routeValuesだけが必要ですが、常に両方を指定するのがベストプラクティスかもしれません。

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

コントローラ:

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