ASP.NET 视ActionLink和职位的方法
-
20-09-2019 - |
题
谁能告诉我我怎么能提交的价值对控制器使用ActionLink和员额的方法?
我不想使用按钮。
我猜有东西!
解决方案
因为这只是呈现一个锚ActionLink
标签不能使用<a>
。结果
您可以使用 jQuery的AJAX帖子。结果
或者只是调用窗体的提交方法有或没有的jQuery(这将是不AJAX),也许在任何控制需要你的想象的onclick
事件。
其他提示
如果您使用ASP MVC3你可以使用一个Ajax.ActionLink(),即允许用户指定哪些你可以设置为“POST”。
一个HTTP方法您可以使用jQuery来为所有的按钮做了POST。只要给他们同样的CssClass名称。
使用 “返回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有正确的答案只是想清楚,因为它是隐藏在他的职位由@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>
}
在完全示出使用情况是在一个网络应用程序的导航栏注销下拉菜单。
@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;" })
)
我对这个问题的解决方案是一个相当简单的。我有一个网页,做一个客户搜索一个由整个电子邮件和其他由局部,局部拉,并显示一个列表中的列表中有一个指向名为GetByID的ActionResult并通过在ID的操作链接
的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对象包含您的数据,它不如果事POST或GET。可以使用特定的动作方法签名选择合适的方法。
我已经使用下面的代码做了同样的问题:
@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 的景点:
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
),隐藏元素的值设置为传递参数的值,浏览器将向控制器提交数据,如下所示:
请求网址:http://localhost:38874/Feedback/Delete
请求方式:POST 状态代码:302 找到
响应头
位置:/反馈主机:Local主机:38874表格数据 X-HTTP-方法覆盖:删除 id:5
如您所见,这是带有 X-HTTP-Method-Override:DELETE 且正文中的数据设置为“id:5”的 POST 请求。响应有 302 代码,该代码重定向到 Index 操作,通过此代码,您可以在删除后刷新屏幕。
我建议呆纯休息的原则和使用HTTP删除你的删除。不幸的是HTML前只有HTTP获取和职位。标记,只可以一个HTTP得到的。一个形式标记可以做一个HTTP获得或职位。幸运的是如果您使用的ajax你可以做一个HTTP删除,这是什么我建议。请参阅以下员额的详细信息: Http删除
调用$。员额(),因为它是基于Ajax将无法正常工作。这样的混合方法需要被用于此目的。
以下是其为我工作溶液中。
步骤: 1.创建href网址与网址和参数调用的方法 使用JavaScript方法2.呼叫正常POST
解决方案:
在.cshtml:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
注意:匿名方法应包裹在(....)() 即
(function() {
//code...
})();
<强> postGo 强>被定义为下面在JavaScript。 其余的是简单..
<强> @ Url.Action( “视图”)作为调用创建URL
<强> {“ID”:@ receipt.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);
我已经用于postGo参考网址
jQuery.post()
如果有自定义的数据将正常工作。如果您想发表的存在形式,它更容易使用 ajaxSubmit()
。
和你不必设置在ActionLink
本身此代码,因为你可以在document.ready()
事件中使用的jQuery $(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>
}
}