ASP.NET MVC एक्शनलिंक और पोस्ट विधि


97

क्या कोई मुझे बता सकता है कि मैं एक्शनलिंक और पोस्ट विधि का उपयोग करके नियंत्रक को कैसे मान दे सकता हूं?
मैं बटन का उपयोग नहीं करना चाहता।
मुझे लगता है कि यह jquery के साथ कुछ है।


1
मैंने एक विधि लिखी है जो Html.ActionLink के समान है, केवल यह सबमिट बटन के साथ POST फॉर्म बनाता है। मैं देखता हूं कि क्या मैं लिंक के साथ बटन को बदलने का विकल्प दे सकता हूं जो फॉर्म सबमिट करता है। यहां देखें: stackoverflow.com/questions/3449807/…
nikib3ro

जवाबों:


58

आप इसका उपयोग नहीं कर सकते ActionLinkक्योंकि यह केवल एक लंगर <a>टैग प्रदान करता है।
आप एक jQuery AJAX पोस्ट का उपयोग कर सकते हैं ।
या सिर्फ jQuery के साथ या बिना फॉर्म की सबमिट विधि को कॉल करें (जो कि गैर-AJAX होगा), शायद onclickजो भी नियंत्रण उनके फैंस को लगे।


70

यदि आप ASP MVC3 का उपयोग कर रहे हैं, तो आप एक Ajax.ActionLink () का उपयोग कर सकते हैं, जो आपको एक HTTP विधि निर्दिष्ट करने की अनुमति देता है जिसे आप "POST" पर सेट कर सकते हैं।


45
ध्यान दें कि इस काम को करने के लिए, आपको अजाक्स जावास्क्रिप्ट फ़ाइलों में से एक को शामिल करना होगा, उदाहरण के लिए " jquery.unobtrusive-ajax.min.js"। अन्यथा, यह क्लिक होने पर POST के बजाय GET करना जारी रखेगा। लिंक बनाने के लिए सिंटैक्स इस तरह होगा:@Ajax.ActionLink("Delete", "Delete", new { id = item.Id }, new AjaxOptions {HttpMethod = "POST"})
कोडिंगविट्स्पाइक

1
विनीत अजाक्स ने ठीक काम किया लेकिन मुझे एक्शन लिंक को थोड़ा अलग इस्तेमाल करना पड़ा, इस AjaxOptions object के बजाय एक डिक्शनरी के रूप में एक डिक्शनरी पास करना: stackoverflow.com/a/10657891/429521 इसके अलावा, मुझे हाथ से अजाक्स विशेषताओं को पास करना था ताकि जेएस क्लिक घटनाओं को पकड़ सकता है और ओवरराइड कर सकता है, वे थे "data-ajax"="true, "data-ajax-url"=<your link> and "data-ajax-method"="Post"। Btw, मैं
फेलिप सबिनो

1
@CokoBWare इस एक stackoverflow.com/questions/10507737/… ? वास्तव में? यह मेरे लिए टूटा हुआ नहीं लगता ...
फेलिप सबिनो

20

आप अपने सभी बटनों के लिए 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);
}

@ goodies4uall वास्तव में, और यह जवाब बस यही करता है। :) सीएसएस वर्ग को "saveButton" (शायद एक भ्रामक नाम) नाम दिया गया है, लेकिन एक एंकर टैग का उपयोग कार्रवाई शुरू करने के लिए किया जाता है
सावंत

18

@ एडोस के पास सही जवाब था, इसे स्पष्ट करना चाहता था क्योंकि यह @CodingWebSpike द्वारा किए गए उनके पोस्ट पर एक टिप्पणी के अंदर छिपा हुआ है।

@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })

6

यहाँ डिफ़ॉल्ट 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>
}

3

एक्शन लिंक कभी भी फायर पोस्ट नहीं करेगा। यह हमेशा GET अनुरोध को ट्रिगर करता है।


2

कॉल द एक्शन लिंक का उपयोग करें:

<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>

फॉर्म वैल्यू सबमिट करने के लिए:

 <% using (Html.BeginForm("CustomerSearchResults", "Customer"))
   { %>
      <input type="text" id="Name" />
      <input type="submit" class="dASButton" value="Submit" />
   <% } %>

यह डेटा को ग्राहक नियंत्रक और CustomerSearchResults कार्रवाई को सबमिट करेगा।



1

इस मुद्दे का मेरा समाधान काफी सरल है। मेरे पास एक पृष्ठ है जो एक ग्राहक को पूरे ईमेल द्वारा एक और दूसरे को आंशिक रूप से खोजता है, आंशिक खींचता है और सूची को प्रदर्शित करता है सूची में एक एक्शन लिंक है जो गेटबिड नामक एक एक्ट्रेसॉल्ट को इंगित करता है और आईडी में गुजरता है

GetByID चयनित ग्राहक के डेटा को फिर से खींचता है

return View("Index", model); 

जो पोस्ट विधि है


1

इसे हल करना मेरे लिए एक कठिन समस्या रही है। मैं रेजर और 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)

मार्गवस्तु वस्तु। मैंने यह कोशिश की है और यह काम करता है। नहीं, आप तकनीकी रूप से कोई पोस्ट नहीं कर रहे हैं या फॉर्म सबमिट नहीं कर रहे हैं, लेकिन यदि रूटवैल्यूज़ ऑब्जेक्ट में आपका डेटा है, तो यह महत्वपूर्ण नहीं है अगर कोई पोस्ट या प्राप्त करें। सही विधि का चयन करने के लिए आप किसी विशेष एक्शन विधि हस्ताक्षर का उपयोग कर सकते हैं।


1
मैंने कोशिश की कि आपका नमूना और ब्राउज़र सर्वर को GET भेजता है, यहां तक ​​कि फ़ॉर्म में पोस्ट प्रकार भी है। यदि एक्शनमैथोड कंट्रोलर में विशेषता है [HttpPost] अनुरोध विफल रहता है क्योंकि मार्ग नहीं मिला है।
विटालि मार्किटानोव 19

1

मैंने निम्नलिखित कोड का उपयोग करके एक ही मुद्दा किया है:

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}

यदि आपके पास पृष्ठ पर कई आइटम हैं, तो आपको उनमें से प्रत्येक को फ़ॉर्म में लपेटने की आवश्यकता होगी, और परिणामस्वरूप कई फॉर्म उत्पन्न होंगे। इसके अलावा <इनपुट प्रकार = सबमिट करें> रेंडर बटन, लिंक नहीं।
विटाली मार्किटानोव 20

@VitaliyMarkitanov आप jQuery के AJAX का उपयोग करने का सुझाव दे रहे हैं?
२०:१५ को आइसकेकर

इस सूत्र में नीचे मेरी पोस्ट देखें, मैंने वहां अपना समाधान समझाया।
विटाली मार्किटानोव

एमवीसी नमूना परियोजना में, यह बहुत ज्यादा वही है जो वे भी करते हैं
माया

1

समस्या के लिए यह मेरा समाधान है। यह 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>

रेजर में रुचि के बिंदु देखें :

  1. जावास्क्रिप्ट फ़ंक्शन confirmDelete(id)जिसे लिंक के साथ उत्पन्न लिंक @Html.ActionLinkपर क्लिक करने पर कहा जाता है;

  2. confirmDelete()फ़ंक्शन की आवश्यक आईडी पर क्लिक किया जा रहा है। इस आइटम को onClickहैंडलर से पारित किया जाता है। confirmDelete("+feedback.Id+");return false;ध्यान देने वाला हैंडलर डिफ़ॉल्ट कार्रवाई को रोकने के लिए झूठा लौटता है - जिसे लक्ष्य का अनुरोध मिलता है। OnClickबटन के लिए घटना विकल्प के रूप में सूची में सभी बटन के लिए jQuery के साथ संलग्न किया जा सकता है (शायद यह और भी बेहतर होगा, क्योंकि यह HTML पृष्ठ में कम पाठ होगा और डेटा को data-विशेषता के माध्यम से पारित किया जा सकता है )।

  3. फॉर्म में है id=myForm, ताकि इसे खोजने के लिए confirmDelete()

  4. क्रिया @Html.HttpMethodOverride(HttpVerbs.Delete)का उपयोग करने के लिए प्रपत्र में शामिल है HttpDelete, जैसा कि कार्रवाई के साथ चिह्नित है HttpDeleteAttribute

  5. जेएस फ़ंक्शन में मैं एक्शन पुष्टिकरण (बाहरी प्लगइन की मदद से, लेकिन मानक पुष्टि ठीक काम करता है) का उपयोग नहीं करता। bind()कॉल बैक या var that=this(आप जो भी पसंद करते हैं) में उपयोग करना न भूलें ।

  6. फॉर्म में एक छिपा हुआ तत्व है 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 कोड होता है, जो इंडेक्स एक्शन को रीडायरेक्ट करता है, इसके द्वारा आप डिलीट करने के बाद अपनी स्क्रीन को रिफ्रेश करते हैं।


0

मैं REST सिद्धांतों के लिए शुद्ध रहने और आपके डिलीट के लिए HTTP डिलीट का उपयोग करने की सलाह दूंगा। दुर्भाग्य से HTML Specs में केवल HTTP Get & Post है। एक टैग केवल एक HTTP प्राप्त कर सकता है। एक फॉर्म टैग या तो एक HTTP गेट या पोस्ट कर सकता है। सौभाग्य से अगर आप अजाक्स का उपयोग करते हैं तो आप एक HTTP डिलीट कर सकते हैं और यही मैं सुझाता हूं। विवरण के लिए निम्नलिखित पोस्ट देखें: Http Deletes


0

$ .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 (प्लगइन?) का उपयोग करते हुए गैर-अजाक्स GET / POST

http://nuonical.com/jquery-postgo-plugin/


0

jQuery.post()आपके पास कस्टम डेटा होने पर काम करेगा। यदि आप मौजूदा फ़ॉर्म पोस्ट करना चाहते हैं, तो इसका उपयोग करना आसान है ajaxSubmit()

और आपको इस कोड को अपने ActionLinkआप में सेटअप करने की आवश्यकता नहीं है , क्योंकि आप document.ready()घटना में लिंक हैंडलर संलग्न कर सकते हैं (जो वैसे भी एक पसंदीदा तरीका है), उदाहरण के लिए $(function(){ ... })jQuery चाल का उपयोग करके ।


0

एक खोज (सूचकांक) पृष्ठ से परिणाम पृष्ठ पर इस जरूरत के पार आया। मुझे @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)

0

यह एमवीसी नमूना परियोजना से लिया गया है

@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>
            }
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.