سؤال

هل يمكن لأحد أن يقول لي كيف يمكنني إرسال القيم إلى وحدة التحكم باستخدام طريقة ActionLink وPOST؟
لا أريد استخدام الأزرار.
أعتقد أنه يحتوي على شيء مع jquery.

هل كانت مفيدة؟

المحلول

لا يمكنك استخدام ActionLink لأن هذا فقط يجعل مرساة <a> بطاقة شعار.
يمكنك استخدام jquery ajax post..
أو مجرد استدعاء طريقة إرسال النموذج مع أو بدون مسج (والتي ستكون غير AJAX)، ربما في onclick حدث أي سيطرة يأخذ يتوهم الخاص بك.

نصائح أخرى

إذا كنت تستخدم ASP MVC3، يمكنك استخدام AJAX.ATYLink ()، تتيح لك تحديد طريقة HTTP التي يمكنك ضبطها على "المشاركة".

يمكنك استخدام JQUERY للقيام بمرور لجميع الأزرار الخاصة بك. فقط أعطهم نفس اسم cssclass.

استخدام "إرجاع خطأ؛" في نهاية حدث onclick JavaScript الخاص بك إذا كنت ترغب في إجراء إعادة التوجيه جانب الخادم بعد النشر وإلا فقط إرجاع العرض.

شفرة الحلاقة

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.ID) 
    @Html.ActionLink("Save", "SaveAction", "MainController", null, new { @class = "saveButton", onclick = "return false;" })
}

رمز مسج

$(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);
}

@Aidos كان لديه الإجابة الصحيحة التي أردت فقط توضيحها لأنها مخفية داخل تعليق على منشوره بواسطةCodingWithSpike.

@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>
}

لن يطلق ActionLink أبدا. انها دائما الزناد الحصول على طلب.

استخدم اتصال الإجراء التالي:

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

لتقديم استخدام قيم النموذج:

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

سيقدم البيانات إلى وحدة تحكم العملاء وعمل العملاء.

استخدم هذا الرابط داخل Ajax.beginform

@Html.ActionLink(
    "Save", 
    "SaveAction", 
    null, 
    null, 
    onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })

;)

حلاي لهذه القضية هو واحد بسيط إلى حد ما. لدي صفحة تقوم بعمل عميل يبحث عن عميل عبر البريد الإلكتروني بأكمله والآخر من خلال السحب الجزئي ويعرض قائمة تحتوي القائمة على رابط عمل يشير إلى ActionResult يسمى GetByID ويمر في المعرف

يسحب 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>
}

طريقة العمل

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 ​​يحتوي على بياناتك، فلا يهم إذا كان منشورًا أو الحصول عليه.يمكنك استخدام توقيع طريقة عمل معينة لتحديد الطريقة الصحيحة.

لقد فعلت نفس المشكلة باستخدام التعليمات البرمجية التالية:

@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>

نقطة الاهتمام في عرض الحلاقة:

  1. وظيفة جافا سكريبت confirmDelete(id) الذي يسمى عندما يتم إنشاء الرابط @Html.ActionLink يتم النقر فوق؛

  2. confirmDelete() وظيفة المعرف المطلوب من البند النقر. يتم تمرير هذا البند من onClick معالج confirmDelete("+feedback.Id+");return false; إرجاع معالج الاهتمام FALSE لمنع الإجراء الافتراضي - الذي يحصل على طلب الهدف. OnClick يمكن إرفاق حدث للأزرار باستخدام JQuery لجميع الأزرار في القائمة كبديل (ربما سيكون أفضل، حيث سيكون أقل نصا في صفحة HTML ويمكن تمرير البيانات عبر data- ينسب).

  3. شكل لديه id=myForm, ، من أجل العثور عليه في confirmDelete().

  4. يشمل النموذج @Html.HttpMethodOverride(HttpVerbs.Delete) من أجل استخدام HttpDelete الفعل، كإجراء ملحوظ مع HttpDeleteAttribute.

  5. في وظيفة JS، أقوم باستخدام تأكيد الإجراء (بمساعدة البرنامج المساعد الخارجي، ولكن تأكيد قياسي يعمل بشكل جيد أيضا. لا تنس استخدام bind() في الاتصال مرة أخرى أو var that=this (اي شيء تفضله).

  6. شكل لديه عنصر مخفي مع id='idField' و name='id'. وبعد لذلك قبل تقديم النموذج بعد التأكيد (result==true)، يتم تعيين قيمة العنصر المخفي على قيمة الوسيطة المرة والمتصفح سيقدم البيانات إلى وحدة تحكم مثل هذا:

طلب URL.:http://localhost:38874/Feedback/Delete

طريقة الطلب: رمز حالة البريد: تم العثور على 302

رؤوس الرد

الموقع: / ردود الفعل المضيف: localhost: 38874بيانات النموذج تجاوز الأسلوب X-HTTP: حذف معرف: 5

كما ترى أنه طلب آخر مع تجاوز الأسلوب X-HTTP: حذف البيانات والبيانات في مجموعة الجسم إلى "ID: 5". الاستجابة لديها 302 رمز الذي يعيد توجيه الإجراء الفهرس، من خلال تحديث الشاشة بعد حذفه.

أوصي بالبقاء نقية لاسترداد المبادئ واستخدام حذف HTTP لحذفك. لسوء الحظ، تحتوي مواصفات HTML فقط على HTTP Get & Post. علامة يمكن فقط الحصول على http. علامة نموذج يمكن أن تفعل إما الحصول على http الحصول على أو نشر. لحسن الحظ إذا كنت تستخدم AJAX، يمكنك القيام بحذف HTTP وهذا ما أوصي به. انظر المنشور التالي للحصول على التفاصيل: حذف HTTP.

استدعاء $ .Post () لن يعمل كما هو يستند إلى ajax. لذلك يجب استخدام طريقة هجينة لهذا الغرض.

فيما يلي الحل الذي يعمل بالنسبة لي.

الخطوات: 1. إنشاء عنوان URL لهيريف الذي يستدعي الطريقة مع عنوان URL ومعلمة 2. استدعاء البريد العادي باستخدام طريقة JavaScript

المحلول:

في .CSHTML:

<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId  } );})()">View</a>

ملاحظة: يجب أن تكون ملفوفة الطريقة المجهولة (....) () IE

(function() {
    //code...
})();

نشر يعرف على النحو التالي في جافا سكريبت. الراحة بسيطة ..

@ url.action ("عرض") يخلق عنوان URL للاتصال

{'ID': @ recept.receiptid} ينشئ معلمات ككائن يتم تحويله بدوره إلى "نشر الحقول" في طريقة النشر. هذا يمكن أن يكون أي معلمة كما تحتاج

في جافا سكريبت:

(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 المرجعية التي استخدمتها للنشر

غير AJAX الحصول على / نشر باستخدام jQuery (البرنامج المساعد؟)

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

jQuery.post() سوف تعمل إذا كان لديك بيانات مخصصة. إذا كنت ترغب في نشر النموذج الموجود، فمن الأسهل استخدامها ajaxSubmit().

وليس لديك لإعداد هذا الرمز في ActionLink نفسها، لأنك تستطيع إرفاق معالج الرابط في 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>
            }
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top