क्या कोई मुझे बता सकता है कि मैं एक्शनलिंक और पोस्ट विधि का उपयोग करके नियंत्रक को कैसे मान दे सकता हूं?
मैं बटन का उपयोग नहीं करना चाहता।
मुझे लगता है कि यह jquery के साथ कुछ है।
क्या कोई मुझे बता सकता है कि मैं एक्शनलिंक और पोस्ट विधि का उपयोग करके नियंत्रक को कैसे मान दे सकता हूं?
मैं बटन का उपयोग नहीं करना चाहता।
मुझे लगता है कि यह jquery के साथ कुछ है।
जवाबों:
आप इसका उपयोग नहीं कर सकते ActionLink
क्योंकि यह केवल एक लंगर <a>
टैग प्रदान करता है।
आप एक jQuery AJAX पोस्ट का उपयोग कर सकते हैं ।
या सिर्फ jQuery के साथ या बिना फॉर्म की सबमिट विधि को कॉल करें (जो कि गैर-AJAX होगा), शायद onclick
जो भी नियंत्रण उनके फैंस को लगे।
यदि आप ASP MVC3 का उपयोग कर रहे हैं, तो आप एक Ajax.ActionLink () का उपयोग कर सकते हैं, जो आपको एक HTTP विधि निर्दिष्ट करने की अनुमति देता है जिसे आप "POST" पर सेट कर सकते हैं।
jquery.unobtrusive-ajax.min.js
"। अन्यथा, यह क्लिक होने पर POST के बजाय GET करना जारी रखेगा। लिंक बनाने के लिए सिंटैक्स इस तरह होगा:@Ajax.ActionLink("Delete", "Delete", new { id = item.Id }, new AjaxOptions {HttpMethod = "POST"})
"data-ajax"="true, "data-ajax-url"=<your link> and "data-ajax-method"="Post"
। Btw, मैं
आप अपने सभी बटनों के लिए POST करने के लिए jQuery का उपयोग कर सकते हैं। बस उन्हें एक ही CssClass नाम दें।
"झूठे लौटें?" यदि आप एक सर्वर साइड RedirectToAction पोस्ट के बाद करना चाहते हैं तो अपने ऑनक्लिक जावास्क्रिप्ट इवेंट के अंत में अन्यथा केवल दृश्य वापस कर दें।
रेजर कोड
@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();
});
});
सी#
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
// Save code here...
return RedirectToAction("Index");
//return View(model);
}
@ एडोस के पास सही जवाब था, इसे स्पष्ट करना चाहता था क्योंकि यह @CodingWebSpike द्वारा किए गए उनके पोस्ट पर एक टिप्पणी के अंदर छिपा हुआ है।
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
यहाँ डिफ़ॉल्ट ASP.NET MVC 5 प्रोजेक्ट में बेक किया गया एक उत्तर था, मेरा मानना है कि UI में मेरे स्टाइलिंग लक्ष्यों को अच्छी तरह से पूरा करता है। कुछ फॉर्म वाले शुद्ध जावास्क्रिप्ट का उपयोग करके फॉर्म सबमिट करें।
@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>
}
एक्शन लिंक कभी भी फायर पोस्ट नहीं करेगा। यह हमेशा 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 चयनित ग्राहक के डेटा को फिर से खींचता है
return View("Index", model);
जो पोस्ट विधि है
इसे हल करना मेरे लिए एक कठिन समस्या रही है। मैं रेजर और 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)
मार्गवस्तु वस्तु। मैंने यह कोशिश की है और यह काम करता है। नहीं, आप तकनीकी रूप से कोई पोस्ट नहीं कर रहे हैं या फॉर्म सबमिट नहीं कर रहे हैं, लेकिन यदि रूटवैल्यूज़ ऑब्जेक्ट में आपका डेटा है, तो यह महत्वपूर्ण नहीं है अगर कोई पोस्ट या प्राप्त करें। सही विधि का चयन करने के लिए आप किसी विशेष एक्शन विधि हस्ताक्षर का उपयोग कर सकते हैं।
मैंने निम्नलिखित कोड का उपयोग करके एक ही मुद्दा किया है:
@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>
रेजर में रुचि के बिंदु देखें :
जावास्क्रिप्ट फ़ंक्शन confirmDelete(id)
जिसे लिंक के साथ उत्पन्न लिंक @Html.ActionLink
पर क्लिक करने पर कहा जाता है;
confirmDelete()
फ़ंक्शन की आवश्यक आईडी पर क्लिक किया जा रहा है। इस आइटम को onClick
हैंडलर से पारित किया जाता है। confirmDelete("+feedback.Id+");return false;
ध्यान देने वाला हैंडलर डिफ़ॉल्ट कार्रवाई को रोकने के लिए झूठा लौटता है - जिसे लक्ष्य का अनुरोध मिलता है। OnClick
बटन के लिए घटना विकल्प के रूप में सूची में सभी बटन के लिए jQuery के साथ संलग्न किया जा सकता है (शायद यह और भी बेहतर होगा, क्योंकि यह HTML पृष्ठ में कम पाठ होगा और डेटा को data-
विशेषता के माध्यम से पारित किया जा सकता है )।
फॉर्म में है id=myForm
, ताकि इसे खोजने के लिए confirmDelete()
।
क्रिया @Html.HttpMethodOverride(HttpVerbs.Delete)
का उपयोग करने के लिए प्रपत्र में शामिल है HttpDelete
, जैसा कि कार्रवाई के साथ चिह्नित है HttpDeleteAttribute
।
जेएस फ़ंक्शन में मैं एक्शन पुष्टिकरण (बाहरी प्लगइन की मदद से, लेकिन मानक पुष्टि ठीक काम करता है) का उपयोग नहीं करता। bind()
कॉल बैक या var that=this
(आप जो भी पसंद करते हैं) में उपयोग करना न भूलें ।
फॉर्म में एक छिपा हुआ तत्व है id='idField'
औरname='id'
। पुष्टि करने के बाद फॉर्म जमा करने से पहले ( result==true
), छिपे हुए तत्व के मूल्य को पास किए गए तर्क को मानने के लिए सेट किया गया है और ब्राउज़र डेटा को इस तरह नियंत्रित करेगा:
URL का अनुरोध करें :http://localhost:38874/Feedback/Delete
अनुरोध विधि : POST स्थिति कोड: 302 मिला
रिस्पांस हेडर
स्थान: / प्रतिक्रिया होस्ट: लोकलहोस्ट: 38874 फॉर्म डेटा एक्स-एचटीटीपी-मेथड-ओवरराइड: DELETE आईडी: 5
जैसा कि आप देखते हैं कि यह X-HTTP-Method-Override: DELETE और डेटा के साथ बॉडी में "id: 5" के लिए POST अनुरोध है। रिस्पॉन्स में 302 कोड होता है, जो इंडेक्स एक्शन को रीडायरेक्ट करता है, इसके द्वारा आप डिलीट करने के बाद अपनी स्क्रीन को रिफ्रेश करते हैं।
मैं REST सिद्धांतों के लिए शुद्ध रहने और आपके डिलीट के लिए HTTP डिलीट का उपयोग करने की सलाह दूंगा। दुर्भाग्य से HTML Specs में केवल HTTP Get & Post है। एक टैग केवल एक HTTP प्राप्त कर सकता है। एक फॉर्म टैग या तो एक HTTP गेट या पोस्ट कर सकता है। सौभाग्य से अगर आप अजाक्स का उपयोग करते हैं तो आप एक HTTP डिलीट कर सकते हैं और यही मैं सुझाता हूं। विवरण के लिए निम्नलिखित पोस्ट देखें: Http Deletes
$ .Post () कॉलिंग काम नहीं करेगी क्योंकि यह अजाक्स आधारित है। तो इस उद्देश्य के लिए एक संकर विधि का उपयोग करने की आवश्यकता है।
निम्नलिखित समाधान है जो मेरे लिए काम कर रहा है।
चरण: 1. href के लिए URL बनाएँ जो url और पैरामीटर के साथ एक विधि कहता है। जावास्क्रिप्ट पद्धति का उपयोग करके सामान्य POST पर कॉल करें
उपाय:
.Cshtml में:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
नोट: अनाम विधि को (....) () में लपेटा जाना चाहिए
(function() {
//code...
})();
पोस्टगो को जावास्क्रिप्ट में नीचे के रूप में परिभाषित किया गया है। बाकी सरल हैं ..
@ Url.Action ("देखें") कॉल के लिए url बनाता है
{'id': @ rece.ReceiptId} ऑब्जेक्ट बनाता है जो पोस्ट-पोस्ट विधि में POST फ़ील्ड में परिवर्तित की गई ऑब्जेक्ट के रूप में है। आप की आवश्यकता के रूप में यह कोई भी पैरामीटर हो सकता है
जावास्क्रिप्ट में:
(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 जो मैंने पोस्ट-पोस्ट के लिए उपयोग किया है
jQuery.post()
आपके पास कस्टम डेटा होने पर काम करेगा। यदि आप मौजूदा फ़ॉर्म पोस्ट करना चाहते हैं, तो इसका उपयोग करना आसान है ajaxSubmit()
।
और आपको इस कोड को अपने ActionLink
आप में सेटअप करने की आवश्यकता नहीं है , क्योंकि आप document.ready()
घटना में लिंक हैंडलर संलग्न कर सकते हैं (जो वैसे भी एक पसंदीदा तरीका है), उदाहरण के लिए $(function(){ ... })
jQuery चाल का उपयोग करके ।
एक खोज (सूचकांक) पृष्ठ से परिणाम पृष्ठ पर इस जरूरत के पार आया। मुझे @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)
यह एमवीसी नमूना परियोजना से लिया गया है
@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>
}
}