Asp.net mvc ASP.NET MVC ActionLink和post方法
有人能告诉我如何使用ActionLink和POST方法向Controller提交值吗?Asp.net mvc ASP.NET MVC ActionLink和post方法,asp.net-mvc,actionlink,Asp.net Mvc,Actionlink,有人能告诉我如何使用ActionLink和POST方法向Controller提交值吗? 我不想使用按钮。 我猜它与jquery有关。如果您有自定义数据,它将起作用。如果您想发布现有表单,它更易于使用 而且您不必在ActionLink本身中设置此代码,因为您可以在document.ready()事件中附加链接处理程序(无论如何这是首选方法),例如使用$(function(){…})jQuery技巧。你不能使用ActionLink,因为它只是呈现一个锚 或者只需调用表单的submit方法,使用jQu
我不想使用按钮。
我猜它与jquery有关。
如果您有自定义数据,它将起作用。如果您想发布现有表单,它更易于使用
而且您不必在
ActionLink
本身中设置此代码,因为您可以在document.ready()
事件中附加链接处理程序(无论如何这是首选方法),例如使用$(function(){…})
jQuery技巧。你不能使用ActionLink
,因为它只是呈现一个锚
或者只需调用表单的submit方法,使用jQuery或不使用jQuery(这将是非AJAX的),可能是在您喜欢的任何控件的onclick
事件中。使用以下调用操作链接:
<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>
要提交表单值,请使用:
<% using (Html.BeginForm("CustomerSearchResults", "Customer"))
{ %>
<input type="text" id="Name" />
<input type="submit" class="dASButton" value="Submit" />
<% } %>
它将向客户控制器和客户搜索结果操作提交数据。ActionLink将永远不会启动post。它总是触发GET请求。如果您使用的是ASP MVC3,您可以使用Ajax.ActionLink(),它允许您指定一个可以设置为“POST”的HTTP方法。我建议保持纯REST原则,并使用HTTP delete进行删除。不幸的是,HTML规范只有HTTPGET&Post。标记只能由HTTP获取。表单标记可以执行HTTP Get或Post。幸运的是,如果您使用ajax,您可以执行HTTP删除,这就是我的建议。有关详细信息,请参阅以下帖子:在Ajax.begin中使用此链接
@Html.ActionLink(
"Save",
"SaveAction",
null,
null,
onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })
)() 我对这个问题的解决方案相当简单。我有一个页面,一个通过整个电子邮件进行客户搜索,另一个通过部分进行搜索,部分拉取并显示一个列表该列表有一个操作链接,指向名为GetByID的actionresult并传入id
GetByID提取所选客户的数据,然后返回
return View("Index", model);
这是一个很难解决的问题。如何在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>
}
这里的要点是Url.Action不关心Action方法是GET还是POST。它将访问任一类型的方法。您可以使用将数据传递给操作方法
@Url.Action(string actionName, string controllerName, object routeValues)
routeValues对象。我已经试过了,而且效果很好。不,从技术上讲,您并不是在发布或提交表单,但是如果routeValues对象包含您的数据,那么它是发布还是获取都无关紧要。您可以使用特定的操作方法签名来选择正确的方法。您可以使用jQuery为所有按钮进行发布。只要给他们一个相同的CssClass名称
如果要在发布后执行服务器端重定向操作,请在onclick javascript事件结束时使用“return false;”,否则只需返回视图
剃刀代码
@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#
@艾多斯得到了正确的答案,只是想澄清一下,因为它隐藏在@CodingWithSpike对其帖子的评论中
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
我使用以下代码完成了相同的问题:
@using (Html.BeginForm("Delete", "Admin"))
{
@Html.Hidden("ProductID", item.ProductID)
<input type="submit" value="Delete" />
}
@使用(Html.BeginForm(“删除”、“管理”))
{
@Html.Hidden(“ProductID”,item.ProductID)
}
调用$.post()将不起作用,因为它是基于Ajax的。因此,为此需要使用一种混合方法
以下是对我有效的解决方案
步骤:
1.为href创建URL,该href使用URL和参数调用a方法
2.使用JavaScript方法调用普通POST
解决方案:
在.cshtml中:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
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);
(函数($){
$扩展({
getGo:函数(url、参数){
document.location=url+'?'+$.param(params);
},
postGo:函数(url、参数){
变量$form=$(“”)
.attr(“方法”、“职位”)
.attr(“操作”,url);
$.each(参数、函数(名称、值){
$("")
.attr(“名称”,名称)
.attr(“值”,值)
.附录($表格);
});
$form.appendTo(“正文”);
$form.submit();
}
});
})(jQuery);
我用于postGo的参考URL
这是我解决这个问题的方法。
这是一个具有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>
..
函数确认删除(id){
bootbox.confirm('@Resources.Resource.AreYouSure',函数(结果){
如果(结果){
document.getElementById('idField')。value=id;
document.getElementById('myForm').submit();
}
}.约束(这个);
}
@使用(Html.BeginForm(“Delete”、“Feedback”、FormMethod.Post、new{id=“myForm”}))
{
@httpmethodverride(HttpVerbs.Delete)
@Html.Hidden(“id”,null,new{id=“idField”})
foreach(模型中的var反馈)
{
if(User.Identity.IsAuthenticated&&User.IsInRole(“admin”))
{
@ActionLink(“Delete Item”,new{id=@feedback.id},new{onClick=“confirmDelete”(+feedback.id+”);返回false;“})
}
}
...
Razor视图中的兴趣点:
JavaScript函数confirmDelete(id)
,当点击@Html.ActionLink
生成的链接时调用该函数
confirmDelete()
功能所需的被删除项id
(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);
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>
@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)
@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>
}
@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>
}
@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>
}
}