ASP.NET MVC ActionLink、postメソッド
-
20-09-2019 - |
質問
誰でもできるので教えてどのようにまた行きたいと思いま価値をコントローラを使用ActionLink後の方法は?
んを利用したいボタンを押します。
思いものjquery.
解決
ActionLink
タグをレンダリングするためにあなたは<a>
を使用することはできません。
あなたは jQueryのAJAXポストを使用することができます。
それとも、フォームのは、おそらくあなたの空想を取るものは何でも制御のonclick
イベントでは、(非AJAXされるであろう)、jQueryを使ってまたはなしでメソッドを呼び出す提出します。
他のヒント
あなたはあなたが「POST」に設定することができHTTPメソッドを指定することができますAjax.ActionLinkを()、使用することができます。
あなたはすべてのボタンのPOSTを行うためのjQueryを使用することができます。ただ、彼らに同じのCssClassの名前を付けます。
"return false;" を使用しますあなたがポストした後、サーバー側のRedirectToActionを行いたい場合はjavascriptのイベントあなたのonclickの終わりにそれ以外の場合は、単にビューを返します。
カミソリコード
@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は、正しい答えはちょうどそれを明確にしたいと考えていました。
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
ここでは、私はそれがUIにうまく自分のスタイリングの目標を達成信じているデフォルトのASP.NET MVC 5プロジェクトに焼いた答えでした。フォームが何らかの含むフォームに純粋な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アクションにデータを送信します。
Ajax.BeginFormの内側には、このリンクを使用します。
@Html.ActionLink(
"Save",
"SaveAction",
null,
null,
onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })
;)
この問題への私のソリューションは、かなり単純なものです。私は、全体のメールで、顧客の検索1と部分、部分的に引っ張ることにより、他を行い、リストには、IDにGetByIDと呼ばれるのActionResultを指すと渡すアクションリンクを持っているリストを表示するページがあります。
GetByIDは
を返し、選択された顧客のデータをプルreturn View("Index", model);
POSTメソッドである
これは私が解決するための困難な問題となっています。どのように私はアクションメソッドを呼び出し、特定のアクションメソッドに値または値を渡すことができますかみそりと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オブジェクトは、あなたのデータが含まれている場合、それはそのポストまたは取得する場合には問題does notのされていません。あなたは正しい方法を選択するために、特定のアクションメソッドのシグネチャを使用することができます。
私は次のコードを使用して同じ問題を行っている。
@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>
周辺の観光スポット、カミソリビュー:
JavaScript機能
confirmDelete(id)
るときに呼び出されるリンクで生成され@Html.ActionLink
クリックす;confirmDelete()
機能に必要なidの対象となっている項目をクリックします。この項目を経過したからonClick
ハンドラconfirmDelete("+feedback.Id+");return false;
注目のハンドラを返しますfalseを防ぐデフォルトアクションである取得請求目標です。OnClick
イベントのためのボタンが添付するjQueryのためのすべてのボタンのリストの代替として(おそらくまでも、そのままとなりますテキストのHTMLページのデータとして渡すことによdata-
属性)に指定します。形
id=myForm
, を見つけるためでconfirmDelete()
.形態を含む
@Html.HttpMethodOverride(HttpVerbs.Delete)
を利用するためには、HttpDelete
動詞としての行動を記HttpDeleteAttribute
.の時のJS関数を使用して行い動作確認(外部プラグインが標準の確認作品があります。も忘れずに使用
bind()
コールローンまたは戻るvar that=this
何です。形の隠し要素
id='idField'
やname='id'
.その前に提出す確認後(result==true
の価値の隠れた要素がセットに渡された値を引数とブラウザに提出データをコントローラのようになります:
リクエストのURL:http://localhost:38874/Feedback/Delete
請求方法:ステータスコード302た
応答ヘッダを
所在地/ィ ホスト:localhost:38874 フォームのデータ X-HTTPメソッドのオーバーライド:DELETE id:5
していますPOSTとX-HTTPメソッドのオーバーライド:削除、データを本体設定"id:5".対応して302コードするリダイレクトインデックスの行動は、このリフレッシュして頂けます様後の画面で削除します。
私は、RESTの原則に純粋に滞在し、HTTPあなたの削除で削除を使用することをお勧めします。残念ながら、HTML仕様は、HTTP GET&ポストがあります。タグは、HTTPのみを取得することができます。 formタグは、HTTP GETまたはPOSTを行うことができます。あなたは、AJAXを使用している場合幸いにも、あなたはHTTPを削除して行うことができ、これは私がお勧めするものです。詳細については、以下の記事を参照してください:<のhref = "http://stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links- because.aspx」のrel = "" nofollowを> HTTPはに削除します。
呼び出し$.ポスト)が成り立たないと思うのでAjaxベースです。うハイブリッドメソッドを使用することです。
以下のソリューションで電話をかけてきました。
手順:1.URLを作成hrefき出しの方法とurlパラメータ 2.普通郵便にJavaScriptを使用方法
【解決
ます。cshtml:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
注意:匿名の方法に包まれ(....)() すなわち
(function() {
//code...
})();
postGo 定義として以下が可能です。残りが簡単..
@ます。アクション("ビュー") 作成の際のurlは、"電話
{'id'オプション:@入することになります。ReceiptId} を作成しパラメータとしてのオブジェクトである回転変換される分野postGo方法です。このときのパラメータとして必要な
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);
参照Urlを使用しpostGo
jQuery.post()
のカスタムデータを持っている場合は動作します。既存のフォームを投稿したい場合は、 ajaxSubmit()
するます。
ActionLink
jQueryのトリックを使用して、たとえば、(とにかく好ましい方法である)document.ready()
イベントにリンクハンドラをアタッチすることができますので、そして、あなたは、$(function(){ ... })
自身でセットアップにこのコードを持っていません。
結果ページに検索(インデックス)ページから投稿する必要がこれに出くわしました。私は@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)
これは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>
}
}