ActionLinkとPOSTメソッドを使用してコントローラーに値を送信する方法を教えてもらえますか?
ボタンは使いたくない。
私はそれがjqueryで何かを持っていると思います。
17 に答える
ASP MVC3を使用している場合は、Ajax.ActionLink()を使用できます。これにより、「POST」に設定できるHTTPメソッドを指定できます。
ActionLink
アンカー<a>
タグをレンダリングするだけなので、を使用することはできません。jQueryAJAX投稿
を使用できます。
または、jQuery(AJAX以外)を使用して、または使用せずにフォームの送信メソッドを呼び出すだけです。onclick
jQueryを使用して、すべてのボタンに対してPOSTを実行できます。同じCssClass名を付けてください。
「falseを返す」を使用します。投稿後にサーバー側のRedirectToActionを実行する場合は、onclick javascriptイベントの最後に、それ以外の場合はビューを返します。
かみそりコード
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.ID)
@Html.ActionLink("Save", "SaveAction", "MainController", null, new { @class = "saveButton", onclick = "return false;" })
}
JQueryコード
$(document).ready(function () {
$('.saveButton').click(function () {
$(this).closest('form')[0].submit();
});
});
C#
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
// Save code here...
return RedirectToAction("Index");
//return View(model);
}
@Aidosの正解は、@ CodingWithSpikeによる彼の投稿へのコメントの中に隠されているため、明確にしたかっただけです。
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
これは、デフォルトのASP.NET MVC 5プロジェクトに組み込まれた回答であり、UIでのスタイリングの目標をうまく達成していると思います。純粋なJavaScriptを使用してフォームを含むフォームにフォームを送信します。
@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
<a href="javascript:document.getElementById('logoutForm').submit()">
<span>Sign out</span>
</a>
}
完全に示されているユースケースは、Webアプリのナビゲーションバーにあるログアウトドロップダウンです。
@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<div class="dropdown">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="ma-nav-text ma-account-name">@User.Identity.Name</span>
<i class="material-icons md-36 text-inverse">person</i>
</button>
<ul class="dropdown-menu dropdown-menu-right ma-dropdown-tray">
<li>
<a href="javascript:document.getElementById('logoutForm').submit()">
<i class="material-icons">system_update_alt</i>
<span>Sign out</span>
</a>
</li>
</ul>
</div>
}
ActionLinkが投稿を起動することはありません。常にGETリクエストをトリガーします。
次の「アクションリンクの呼び出し」を使用します。
<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>
フォームの値を送信するには、次を使用します。
<% using (Html.BeginForm("CustomerSearchResults", "Customer"))
{ %>
<input type="text" id="Name" />
<input type="submit" class="dASButton" value="Submit" />
<% } %>
データをカスタマーコントローラーとCustomerSearchResultsアクションに送信します。
これはMVCサンプルプロジェクトから取得されます
@if (ViewBag.ShowRemoveButton)
{
using (Html.BeginForm("RemoveLogin", "Manage"))
{
@Html.AntiForgeryToken()
<div>
@Html.Hidden("company_name", account)
@Html.Hidden("returnUrl", Model.returnUrl)
<input type="submit" class="btn btn-default" value="Remove" title="Remove your email address from @account" />
</div>
}
}
Ajax.BeginForm内でこのリンクを使用します
@Html.ActionLink(
"Save",
"SaveAction",
null,
null,
onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })
;)
この問題に対する私の解決策は、かなり単純なものです。顧客がメール全体で検索し、部分的に検索するページがあります。部分的にリストをプルして表示します。リストには、GetByIDというアクション結果を指すアクションリンクがあり、IDを渡します。
GetByIDは、選択した顧客のデータを取得してから返します
return View("Index", model);
これはpostメソッドです
これは私にとって解決が難しい問題でした。アクションメソッドを呼び出して1つまたは複数の値を特定のアクションメソッドに渡すことができる動的リンクをrazorおよびhtmlで構築するにはどうすればよいですか?カスタムhtmlヘルパーを含むいくつかのオプションを検討しました。シンプルでエレガントなソリューションを思いついたところです。
景色
@model IEnumerable<MyMvcApp.Models.Product>
@using (Html.BeginForm()) {
<table>
<thead>
<tr>
<td>Name</td>
<td>Price</td>
<td>Quantity</td>
</tr>
</thead>
@foreach (Product p in Model.Products)
{
<tr>
<td><a href="@Url.Action("Edit", "Product", p)">@p.Name</a></td>
<td>@p.Price.ToString()</td>
<td>@p.Quantity.ToString()</td>
</tr>
}
</table>
}
アクションメソッド
public ViewResult Edit(Product prod)
{
ContextDB contextDB = new ContextDB();
Product product = contextDB.Products.Single(p => p.ProductID == prod.ProductId);
product = prod;
contextDB.SaveChanges();
return View("Edit");
}
ここでのポイントは、Url.Actionは、アクションメソッドがGETであるかPOSTであるかを気にしないということです。どちらのタイプのメソッドにもアクセスします。を使用してデータをアクションメソッドに渡すことができます
@Url.Action(string actionName, string controllerName, object routeValues)
routeValuesオブジェクト。私はこれを試しましたが、動作します。いいえ、技術的に投稿やフォームの送信は行っていませんが、routeValuesオブジェクトにデータが含まれている場合は、投稿か取得かは関係ありません。特定のアクションメソッドシグネチャを使用して、適切なメソッドを選択できます。
私は次のコードを使用して同じ問題を実行しました:
@using (Html.BeginForm("Delete", "Admin"))
{
@Html.Hidden("ProductID", item.ProductID)
<input type="submit" value="Delete" />
}
これが私の問題の解決策です。これは2つのアクションメソッドを持つコントローラーです
public class FeedbackController : Controller
{
public ActionResult Index()
{
var feedbacks =dataFromSomeSource.getData;
return View(feedbacks);
}
[System.Web.Mvc.HttpDelete]
[System.Web.Mvc.Authorize(Roles = "admin")]
public ActionResult Delete([FromBody]int id)
{
return RedirectToAction("Index");
}
}
ビューでは、次の構造で構成をレンダリングします。
<html>
..
<script src="~/Scripts/bootbox.min.js"></script>
<script>
function confirmDelete(id) {
bootbox.confirm('@Resources.Resource.AreYouSure', function(result) {
if (result) {
document.getElementById('idField').value = id;
document.getElementById('myForm').submit();
}
}.bind(this));
}
</script>
@using (Html.BeginForm("Delete", "Feedback", FormMethod.Post, new { id = "myForm" }))
{
@Html.HttpMethodOverride(HttpVerbs.Delete)
@Html.Hidden("id",null,new{id="idField"})
foreach (var feedback in @Model)
{
if (User.Identity.IsAuthenticated && User.IsInRole("admin"))
{
@Html.ActionLink("Delete Item", "", new { id = @feedback.Id }, new { onClick = "confirmDelete("+feedback.Id+");return false;" })
}
}
...
</html>
Razor Viewの注目点:
confirmDelete(id)
で生成されたリンクがクリックされたときに呼び出されるJavaScript関数@Html.ActionLink
。confirmDelete()
クリックされているアイテムの関数必須ID。このアイテムはonClick
ハンドラーから渡されconfirmDelete("+feedback.Id+");return false;
ます。注意を払うハンドラーは、デフォルトのアクション(ターゲットへのgetリクエスト)を防ぐためにfalseを返します。OnClick
ボタンのイベントは、代替としてリスト内のすべてのボタンのjQueryに添付できます(HTMLページのテキストが少なくなり、データがdata-
属性を介して渡される可能性があるため、おそらくさらに優れています)。フォームには
id=myForm
、でそれを見つけるために、がありconfirmDelete()
ます。フォームには、動詞
@Html.HttpMethodOverride(HttpVerbs.Delete)
を使用するために、。HttpDelete
でマークされたアクションとして含まれHttpDeleteAttribute
ます。bind()
JS関数では、アクション確認を使用します(外部プラグインを使用しますが、標準の確認も正常に機能します。コールバックまたはvar that=this
(好きなもの)で使用することを忘れないでください。フォームには、とで隠された要素が
id='idField'
ありname='id'
ます。したがって、確認(result==true
)後にフォームが送信される前に、非表示要素の値が渡された引数の値に設定され、ブラウザーは次のようにデータをコントローラーに送信します。
リクエストURL:http://localhost:38874/Feedback/Delete
リクエスト方法:POSTステータスコード:302が見つかりました
応答ヘッダー
場所:/フィードバックホスト:localhost:38874 フォームデータX-HTTP-Method-Override:DELETE id:5
ご覧のとおり、X-HTTP-Method-Override:DELETEと本文のデータが「id:5」に設定されたPOSTリクエストです。応答には、インデックスアクションにリダイレクトする302コードがあります。これにより、削除後に画面を更新します。
jQuery.post()
カスタムデータがある場合は機能します。既存のフォームを投稿する場合は、を使用する方が簡単ajaxSubmit()
です。
また、たとえばjQueryトリックを使用ActionLink
して、イベントでリンクハンドラーをアタッチできるため(とにかく推奨される方法です)、このコード自体をセットアップする必要はありません。document.ready()
$(function(){ ... })
RESTの原則を忠実に守り、削除にはHTTP削除を使用することをお勧めします。残念ながら、HTML仕様にはHTTP Get&Postしかありません。タグはHTTPGetのみが可能です。フォームタグは、HTTPGetまたはPostのいずれかを実行できます。幸い、ajaxを使用している場合は、HTTP削除を実行できます。これは、私がお勧めする方法です。詳細については、次の投稿を参照してください。Http Deletes
$ .post()の呼び出しは、Ajaxベースであるため機能しません。したがって、この目的にはハイブリッド方式を使用する必要があります。
以下は私のために働いている解決策です。
手順:1。urlとパラメーターを使用してメソッドを呼び出すhrefのURLを作成します。2。JavaScriptメソッドを使用して通常のPOSTを呼び出します。
解決:
.cshtmlの場合:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
注:匿名メソッドは(....)()でラップする必要があります。
(function() {
//code...
})();
postGoはJavaScriptで以下のように定義されています。残りは簡単です。
@ Url.Action( "View")は、呼び出しのURLを作成します
{'id':@ receipt.ReceiptId}は、postGoメソッドでPOSTフィールドに変換されるオブジェクトとしてパラメーターを作成します。これは、必要に応じて任意のパラメーターにすることができます
JavaScriptの場合:
(function ($) {
$.extend({
getGo: function (url, params) {
document.location = url + '?' + $.param(params);
},
postGo: function (url, params) {
var $form = $("<form>")
.attr("method", "post")
.attr("action", url);
$.each(params, function (name, value) {
$("<input type='hidden'>")
.attr("name", name)
.attr("value", value)
.appendTo($form);
});
$form.appendTo("body");
$form.submit();
}
});
})(jQuery);
postGoに使用した参照URL
検索(インデックス)ページから結果ページにPOSTする必要があることに遭遇しました。@Vitaliyが述べたほど多くは必要ありませんでしたが、それは私を正しい方向に向けました。私がしなければならなかったのはこれだけでした:
@using (Html.BeginForm("Result", "Search", FormMethod.Post)) {
<div class="row">
<div class="col-md-4">
<div class="field">Search Term:</div>
<input id="k" name="k" type="text" placeholder="Search" />
</div>
</div>
<br />
<div class="row">
<div class="col-md-12">
<button type="submit" class="btn btn-default">Search</button>
</div>
</div>
}
私のコントローラーには、次の署名方法がありました。
[HttpPost]
public async Task<ActionResult> Result(string k)