এএসপি.নেট এমভিসি অ্যাকশনলিঙ্ক এবং পোস্ট পদ্ধতি


98

কেউ কি আমাকে বলতে পারেন যে আমি কীভাবে অ্যাকশন লিঙ্ক এবং পোস্ট পোস্ট ব্যবহার করে নিয়ন্ত্রণকারীর কাছে মান জমা দিতে পারি?
আমি বোতাম ব্যবহার করতে চাই না।
আমার ধারণা এটিতে jquery সহ কিছু আছে।


4
আমি একটি পদ্ধতি লিখেছি যা এইচটিএমএল.অ্যাকশনলিঙ্কের অনুরূপ, কেবল এটি জমা দিন বোতামের সাথে পোস্ট ফর্ম তৈরি করে। আমি দেখতে পাচ্ছি যে আমি ফর্ম জমা দেওয়ার লিঙ্কের সাথে বোতামটি প্রতিস্থাপনের বিকল্প দিতে পারি কিনা। এখানে দেখুন: stackoverflow.com/questions/3449807/...
nikib3ro

উত্তর:


58

আপনি একটি ব্যবহার করতে পারবেন না ActionLinkকারণ এটি কেবল একটি অ্যাঙ্কর <a>ট্যাগ সরবরাহ করে।
আপনি একটি jQuery AJAX পোস্ট ব্যবহার করতে পারেন ।
অথবা কেবল jQuery (যা অ-আজেএক্স হবে না) ছাড়াই বা ফর্মের জমা দেওয়ার পদ্ধতিটি কল করুন, সম্ভবত onclickযে কোনও নিয়ন্ত্রণই আপনার অভিনব লাগে event


71

আপনি যদি এএসপি এমভিসি 3 ব্যবহার করে থাকেন তবে আপনি একটি অ্যাজাক্স ব্যবহার করতে পারেন ction


46
নোট করুন যে এই কাজটি করতে, আপনাকে একটি এজ্যাক্স জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করতে হবে, উদাহরণস্বরূপ " jquery.unobtrusive-ajax.min.js"। অন্যথায়, এটি ক্লিক করার সময় পোষ্টের পরিবর্তে জিইটি করা চালিয়ে যাবে। লিঙ্কটি তৈরি করার সিনট্যাক্সটি এমন হবে:@Ajax.ActionLink("Delete", "Delete", new { id = item.Id }, new AjaxOptions {HttpMethod = "POST"})
কোডিংবিথস্পাইক

4
বিচক্ষণ Ajax জরিমানা কাজ কিন্তু আমি কর্ম লিংক একটু ভিন্ন ব্যবহার করতে ছিল, একটি অভিধান এই AjaxOptions পরিবর্তে প্যারামিটার হিসাবে ক্ষণস্থায়ী বস্তু: stackoverflow.com/a/10657891/429521 এছাড়াও, আমি Ajax হাতে বৈশিষ্ট্যাবলী পাস ছিল যাতে জেএস ক্লিক ইভেন্টগুলি ধরতে এবং ওভাররাইড করতে পারে, তারা ছিল "data-ajax"="true, "data-ajax-url"=<your link> and "data-ajax-method"="Post"। বিটিডব্লিউ, আমি এএসপি.নেট এমভিসি 3 ব্যবহার করছি
ফিলিপ সাবিনো

4
এই এক @CokoBWare stackoverflow.com/questions/10507737/... ? সত্যি? আমার কাছে এটি ভেঙে গেছে বলে মনে হচ্ছে না ...
ফিলিপ সাবিনো

21

আপনি আপনার সমস্ত বোতামের জন্য একটি পোস্ট করতে jQuery ব্যবহার করতে পারেন। তাদের কেবল একই সিএসসি ক্লাসের নাম দিন।

"মিথ্যা ফেরত দিন" ব্যবহার করুন আপনার অনক্লিক জাভাস্ক্রিপ্ট ইভেন্ট শেষে পোস্টের পরে যদি আপনি কোনও সার্ভার সাইড 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);
}

@ গুডিজ 4 ইয়েল আসলে, এবং এই উত্তরটি ঠিক তাই করে। :) সিএসএস ক্লাসটির নাম দেওয়া হয়েছে "সেভবটন" (সম্ভবত একটি বিভ্রান্তিমূলক নাম), তবে ক্রিয়াটি শুরু করতে একটি অ্যাঙ্কর ট্যাগ ব্যবহার করা হয়েছে
সাভান্তেস

18

@ কোডিংভিথস্পাইকের দ্বারা পোস্ট করা একটি পোস্টে একটি মন্তব্যের মধ্যে এটি লুকানো আছে বলেই এইডসের সঠিক উত্তর ছিল এটি পরিষ্কার করতে চেয়েছিল।

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

7

এখানে একটি উত্তর ডিফল্ট এএসপি.নেট এমভিসি 5 প্রকল্পে বেক করা হয়েছিল আমি বিশ্বাস করি যে আমার স্টাইলিং লক্ষ্যগুলি ইউআইতে দুর্দান্তভাবে অর্জন করে। কিছু সমন্বিত ফর্মটিতে খাঁটি জাভাস্ক্রিপ্ট ব্যবহার করে ফর্ম জমা দিন।

@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

অ্যাকশনলিঙ্ক কখনও পোস্ট পোস্ট করবে না। এটি সর্বদা জিইটি অনুরোধটি ট্রিগার করে।


2

নিম্নলিখিত কলটি অ্যাকশন লিঙ্কটি ব্যবহার করুন:

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

ফর্মের মান জমা দেওয়ার জন্য ব্যবহার করুন:

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

এটি গ্রাহক নিয়ন্ত্রক এবং গ্রাহক অনুসন্ধানের ফলাফলগুলি অ্যাকশনটিতে ডেটা জমা দেবে।


1

এই লিঙ্কটি Ajax.BeginForm এর মধ্যে ব্যবহার করুন

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

;)


1

আমার এই সমস্যাটির সমাধানটি মোটামুটি সহজ। আমার একটি পৃষ্ঠা রয়েছে যা গ্রাহক একটিকে পুরো ইমেলের মাধ্যমে এবং অন্যটি আংশিকভাবে অনুসন্ধান করে, আংশিকভাবে তালিকাগুলি প্রদর্শন করে একটি তালিকা প্রদর্শন করে তালিকার একটি অ্যাকশন লিঙ্ক রয়েছে যা গেটবাইআইডি নামে একটি ক্রিয়াকলাপের দিকে নির্দেশ করে এবং আইডিতে পাস করে

GetByID নির্বাচিত গ্রাহকের জন্য ডেটা টানছে তারপরে ফেরত দেয়

return View("Index", model); 

যা পোস্ট পদ্ধতি


1

এটি সমাধান করা আমার পক্ষে একটি কঠিন সমস্যা হয়ে দাঁড়িয়েছে। আমি কীভাবে রেজার এবং এইচটিএমএলগুলিতে একটি গতিশীল লিঙ্ক তৈরি করতে পারি যা কোনও ক্রিয়া পদ্ধতিতে কল করতে পারে এবং একটি নির্দিষ্ট ক্রিয়া পদ্ধতিতে কোনও মান বা মান পাস করতে পারে? আমি কাস্টম এইচটিএমএল সহায়ক সহ বেশ কয়েকটি বিকল্প বিবেচনা করেছি। আমি সবেমাত্র একটি সহজ এবং মার্জিত সমাধান নিয়ে এসেছি।

দৃশ্য

@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.Aक्शनটি ক্রিয়াকলাপটি জিইটি বা পোষ্ট কিনা তা বিবেচনা করে না। এটি উভয় পদ্ধতিতে অ্যাক্সেস করবে। আপনি ব্যবহার করে ক্রিয়া পদ্ধতিতে আপনার ডেটা পাস করতে পারেন

@Url.Action(string actionName, string controllerName, object routeValues)

রুটভ্যালুজ অবজেক্ট। আমি এটি চেষ্টা করেছি এবং এটি কাজ করে। না, আপনি প্রযুক্তিগতভাবে কোনও পোস্ট করছেন না বা ফর্মটি জমা দিচ্ছেন না তবে যদি রুটভ্যালিউজ অবজেক্টটিতে আপনার ডেটা রয়েছে তবে তা কোনও পোস্ট বা প্রাপ্ত তা গুরুত্বপূর্ণ নয়। সঠিক পদ্ধতিটি নির্বাচন করতে আপনি কোনও বিশেষ ক্রিয়া পদ্ধতির স্বাক্ষর ব্যবহার করতে পারেন।


4
আমি আপনার নমুনা চেষ্টা করেছি এবং ব্রাউজারটি সার্ভারে জিইটি প্রেরণ করে, এমনকি ফর্মের পোস্ট টাইপ রয়েছে। যদি কন্ট্রোলারে অ্যাকশনমেডোডের বৈশিষ্ট্য থাকে তবে [এইচটিটিপি পোস্ট] অনুরোধ ব্যর্থ হয়েছে কারণ রুটটি পাওয়া যায় নি।
ভিতালিয়া মারকিতানভ

1

নিম্নলিখিত কোডগুলি ব্যবহার করে আমি একই সমস্যাটি করেছি:

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

পৃষ্ঠাটিতে আপনার যদি অনেকগুলি আইটেম থাকে তবে আপনাকে সেগুলির প্রতিটি ফর্মের মধ্যে আবৃত করতে হবে এবং ফলস্বরূপ অনেকগুলি ফর্ম উত্পন্ন হবে। এছাড়াও <ইনপুট টাইপ = জমা> রেন্ডার বোতাম, লিঙ্ক নয়।
ভিতালিয়া মারকিতানভ

@ ভিটালিমার্কিটানভ আপনি কি jQuery এজ্যাক্স ব্যবহার করার পরামর্শ দিচ্ছেন?
isxaker

এই থ্রেডের নীচে আমার পোস্টটি দেখুন, আমি আমার সমাধানটি সেখানে ব্যাখ্যা করেছি।
ভিটালিয়া মারকিতানভ

এমভিসি নমুনা প্রকল্পে এটি তারা ঠিক কী করছেন
মায়া

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), লুকানো উপাদানটির মান পাস হওয়া যুক্তির মান হিসাবে সেট করা হয় এবং ব্রাউজারটি নিয়ামকের কাছে ডেটা জমা দেয়:

ইউআরএল অনুরোধ :http://localhost:38874/Feedback/Delete

অনুরোধের পদ্ধতি : POST স্থিতি কোড: 302 পাওয়া গেছে

প্রতিক্রিয়া শিরোনাম

অবস্থান: / প্রতিক্রিয়া হোস্ট: লোকালহোস্ট: 38874 ফর্ম ডেটা এক্স-এইচটিটিপি-পদ্ধতি-ওভাররাইড: মোছা আইডি: 5

আপনি দেখতে পাচ্ছেন এটি এক্স-এইচটিটিপি-মেথড-ওভাররাইডের সাথে পোস্টের অনুরোধ: ডিডিএলটিইডি এবং ডেটাতে "আইডি: 5" এ সেট ডেটা। প্রতিক্রিয়াতে 302 কোড রয়েছে যা সূচক ক্রিয়ায় পুনর্নির্দেশ করে, এর মাধ্যমে আপনি মুছে ফেলার পরে আপনার পর্দা রিফ্রেশ করেন।


1

এটি এমভিসি নমুনা প্রকল্প থেকে নেওয়া হয়েছে

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

0

আমি বিশুদ্ধ থেকে বিশ্রামের নীতিগুলিকে বিশুদ্ধ থাকার এবং আপনার মোছার জন্য একটি এইচটিটিপি মুছা ব্যবহার করার পরামর্শ দেব। দুর্ভাগ্যক্রমে এইচটিএমএল স্পেক্সগুলিতে কেবল এইচটিটিপি গেট এবং পোস্ট রয়েছে। একটি ট্যাগ কেবল একটি HTTP পেতে পারে। একটি ফর্ম ট্যাগ হয় একটি HTTP গেট বা পোস্ট করতে পারে। সৌভাগ্যক্রমে আপনি যদি অজ্যাক্স ব্যবহার করেন তবে আপনি এইচটিটিপি মুছতে পারেন এবং এটিই আমার পরামর্শ। বিস্তারিত জানার জন্য নীচের পোস্টটি দেখুন: এইচটিটিপি মুছে ফেলে


0

P। পোষ্ট () কল করা এজ্যাক্স ভিত্তিক হিসাবে কাজ করবে না। সুতরাং এই উদ্দেশ্যে একটি সংকর পদ্ধতি ব্যবহার করা প্রয়োজন।

সমাধানটি আমার জন্য কাজ করছে যা নিম্নলিখিত।

পদক্ষেপগুলি: 1.আরএফের জন্য ইউআরএল তৈরি করুন যা ইউআরএল এবং প্যারামিটার সহ একটি পদ্ধতি কল করে Java. জাভাস্ক্রিপ্ট পদ্ধতি ব্যবহার করে সাধারণ পোস্টটি কল করুন

সমাধান:

.Cshtml এ:

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

দ্রষ্টব্য: বেনামে পদ্ধতিটি (....) () এর মধ্যে মোড়ানো উচিত

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

postGo নীচে জাভাস্ক্রিপ্ট হিসাবে সংজ্ঞায়িত করা হয়। বিশ্রামগুলি সহজ ..

@ ইউআরএল.অ্যাকশন ("দেখুন") কলটির জন্য ইউআরএল তৈরি করে

id 'আইডি': @ রসিদ Rআরসিপটিআইডি object অবজেক্ট হিসাবে প্যারামিটার তৈরি করে যা পোস্টগো পদ্ধতিতে পিওএসটি ক্ষেত্রে রূপান্তরিত হয়। আপনার প্রয়োজন মতো এটি কোনও প্যারামিটার হতে পারে

জাভাস্ক্রিপ্টে:

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

রেফারেন্স ইউআরএলগুলি যা আমি পোস্টগোতে ব্যবহার করেছি

অ-অজ্যাক্স জিইউকিরি (প্লাগইন?) ব্যবহার করে জিইটি / পোস্ট করুন

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


0

jQuery.post()আপনার কাস্টম ডেটা থাকলে কাজ করবে। আপনি যদি বিদ্যমান ফর্মটি পোস্ট করতে চান তবে এটি ব্যবহার করা সহজ ajaxSubmit()

এবং আপনাকে এই কোডটি ActionLinkনিজেই সেটআপ করতে হবে না , যেহেতু আপনি document.ready()ইভেন্টটিতে লিঙ্ক হ্যান্ডলার সংযুক্ত করতে পারেন (যা যাইহোক পছন্দসই পদ্ধতি), উদাহরণস্বরূপ $(function(){ ... })jQuery ট্রিক ব্যবহার করে।


0

এটি অনুসন্ধান (সূচীকরণ) পৃষ্ঠা থেকে ফলাফল পৃষ্ঠায় পোষ্ট করার প্রয়োজনীয়তা অর্জন করেছে। @ ভিটালির বিবরণ অনুসারে আমার ততটা প্রয়োজন ছিল না তবে এটি আমাকে সঠিক দিকে নির্দেশ করেছে। আমাকে যা করতে হয়েছিল তা হ'ল:

@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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.