私は完全にASP.Netに不慣れで、これは私がレポートを生成するためのリンクがありますがレポートを生成することができるようにするビューを持っている非常に基本的な質問です。そうですね。
これまで、コントローラからビューに渡されたモデルを使用してサーバーからビューにデータを渡すことができましたが、ビューからコントローラにデータを渡す方法がわかりません。
この場合は、ビューからコントローラに文字列を渡すだけです。
例を使ってアドバイスをいただければ幸いです。
UPDATE
データをサーバーにポストバックする必要があることは理解していますが、それがrazorhtmlコードおよびコントローラーの形でどのように実現されるのでしょうか。
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" />
}
あなたが投稿したくない/投稿する必要がない場合:
@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だけが必要ですが、常に両方を指定するのがベストプラクティスかもしれません。
<form action="myController/myAction" method="POST">
<input type="text" name="valueINeed" />
<input type="submit" value="View Report" />
</form>
コントローラ:
[HttpPost]
public ActionResult myAction(string valueINeed)
{
//....
}