MVC make action link выполнить отправку - PullRequest
8 голосов
/ 10 августа 2010

В настоящее время я пытаюсь выполнить отправку html, но с помощью вспомогательного метода MVC ActionLink я не хочу, чтобы это была кнопка, я хочу, чтобы она была подчеркнутой ссылкой, как остальные на моей странице. Это то, что у меня сейчас

<%= Html.ActionLink("Delete Selected", "DeleteCheckBox", "Domains", "Default.aspx", new { type="submit" }) %>

Это возвращает меня обратно к действию, но все домены, отмеченные для удаления, не возвращаются. (если я использую это, <input type="submit" name="DeleteAction" value="Delete" />, он работает нормально, так что я знаю, что нет ничего плохого в том, чтобы установить или получить флажки)

Вот что у меня есть ...

> "%>

Индекс

<h2>Domain List</h2>

<h2 style="color: #FF0000"><%= Html.Encode(ViewData[IProwlAdminUI.Utils.Global.ExceptionMessageKey]) %></h2>
<h2 style="color: #FF0000"><%= Html.Encode(ViewData["Message"]) %></h2>

<% using (Html.BeginForm("DeleteCheckBox", "Domains"))
   { %>
   <% if (ViewData.ContainsKey("DeleteMessage")) 
       { %>
       <h2 style="color: #FF0000"><%= Html.Encode(ViewData["DeleteMessage"]) %></h2>
       <input type="submit" name="DeleteAction" value="Commit" /> <input type="reset" name="DeleteAction" value="Cancel" /> 
    <% } %>
   <p>
    <%= Html.ActionLink("Create New", "Create") %> 
    | <%= Html.ActionLink("Export List", "Export") %> 
    | **<a href="javascript:void(0)" class="DeleteLink">Delete Selected</a>**

    <% if (ViewData.ContainsKey("Path")) 
       { %> 
       | <%= Html.ReferenceToFile("/download/Domains.xls", "Exported File") %>
    <% } %>
    </p>

    <div style="overflow:scroll; width:100%">
    <% Html.Telerik().Grid(Model).Name("Domains")
        .DataKeys(dataKeys => dataKeys.Add(c => c.DomainId)).DataKeys(dataKeys => dataKeys.Add(c => c.Name))
        .Columns(columns =>
        {
            columns.Template(o =>
            {  %>
                <%= Html.ActionLink("Edit", "Edit", new { id = o.DomainId })%> 
                <%
        }).Title("Edit");
            columns.Template(o =>
            { %>
            <% if (ViewData.ContainsKey("DeleteMessage"))
               { %>
               <input type='checkbox' checked="checked" id='<%= o.Name %>' name='DeleteIds' value='<%= o.DomainId %>' />
            <% } %>
            <% else
                { %>
               <input type='checkbox' id='<%= o.Name %>' name='DeleteIds' value='<%= o.DomainId %>' />
             <% } %>
               <%
        }).Title("Delete");

            columns.Bound(o => o.DomainId);
            columns.Bound(o => o.Name);
            columns.Bound(o => o.SiteId);
            columns.Bound(o => o.ScrubAndRedirect);
            columns.Bound(o => o.ReportingSiteId);
            columns.Bound(o => o.TrafficCopClass);
            columns.Bound(o => o.SiteName);
            columns.Bound(o => o.FeedType);
            columns.Bound(o => o.Active);
        }).Sortable().Filterable().DataBinding(db => db.Server().Select("Index", "Domains")).Render();%>
     </div> 
     <% if (!ViewData.ContainsKey("DeleteMessage"))
        { %>
     <input type="submit" name="DeleteAction" value="Delete" />   
     <% } %>
<% } %>     
<p>
    <%= Html.ActionLink("Create New", "Create") %> | <%= Html.ActionLink("Export List", "Export") %> 
    <% if (ViewData.ContainsKey("Path")) 
       { %> 
       | <%= Html.ReferenceToFile("/download/Domains.xls", "Exported File") %>
    <% } %>
</p>
**<script type="text/javascript">
    $(function() {
        $('.DeleteLink').click(function() {
            $(this).closest('form')[0].submit();
        });
    });
</script>**

Ответы [ 8 ]

4 голосов
/ 10 августа 2010

Вы не можете заставить гиперссылку отправлять форму без Javascript.

Используя jQuery, вы можете написать

<a href="javascript:void(0)" class="DeleteLink">Delete Selected</a>

$('.DeleteLink').click(function() { 
    $(this).closest('form')[0].submit();
});
2 голосов
/ 11 августа 2010

Добавляя к SLaks, вы можете убедиться, что ваш код jQuery сработает в нужное время (независимо от расположения на странице), используя следующее:

<script type="text/javascript">
   $(document).ready(function(){
      $('.DeleteLink').click(function() { 
         $(this).closest('form')[0].submit();
       });
   });
</script>

Обернув код в $(document).ready(...), выубедитесь, что код не будет запущен до завершения загрузки страницы.

1 голос
/ 20 марта 2015

Большинство ответов, которые я видел, основаны на jQuery или представляют собой какую-то необычную отправку ajax, а это не то, что я хотел.Поэтому я написал метод расширения HtmlHelper, который создает простую форму со скрытыми вводами и кнопками.Это работа в процессе ... все еще может сделать работу.Вот класс:

public static class HtmlHelperExt
{
    public static HtmlString PostLink(this HtmlHelper html, string text, string action, object routeValues)
    {
        var tbForm = new TagBuilder("form");
        tbForm.MergeAttribute("method", "POST");
        tbForm.MergeAttribute("action", action);

        var inputDict = HtmlHelper.ObjectToDictionary(routeValues);
        var inputs = new List<string>();
        foreach (var key in inputDict.Keys)
        {
            const string inputFormat = @"<input type='hidden' name='{0}' value='{1}' />";

            var input = String.Format(inputFormat, key, html.Encode(inputDict[key]));
            inputs.Add(input);
        }

        var submitBtn = "<input type='submit' value='{0}'>";
        inputs.Add(String.Format(submitBtn, text));

        var innerHtml = String.Join("\n", inputs.ToArray());
        tbForm.InnerHtml = innerHtml;

        // return self closing
        return new MvcHtmlString(tbForm.ToString());
    }
}

Чтобы использовать его, в Razor вы пишете:

@Html.PostLink("ButtonText", "/Controller/Action", new { id = item.Id, hello="world" })

И как результат, в HTML вы получите:

<form action="/Controller/Action" method="POST">
    <input type="hidden" name="id" value="1">
    <input type="hidden" name="hello" value="world">
    <input type="submit" value="ButtonText">
</form>
1 голос
/ 10 августа 2010

Вместо создания ссылки действия, вам лучше написать код JavaScript на стороне клиента, который будет отправлять форму для вас при нажатии на ссылку.

Вы можете легко использовать jQuery чтобы сделать это, используя метод отправки для селектора, который выбирает форму:

<form id="myForm">
   <!-- Other form inputs -->
   <a id="myFormSubmit" href="#">Submit form</a>
</form>

<script>
    // Assuming you have jQuery loaded.
    $(document).ready(function() {
        // Can load the results of the selector 
        // for the form here.
        // No need to load it every time in the
        // event handler.
        // Even though more often than not the
        // form will cause a reload of the page
        // if you are using the jQuery form validation
        // plugin, you could end up calling the click
        // event repeatedly.
        var myForm = $("#myForm");

        // Add the event handler for the link.
        $("#myFormSubmit").click(function() {
            // Submit the form.
            myForm.submit();

            // Return false, don't want
            // default click action to take place.
            return false;
        });
    });

</script>
0 голосов
/ 19 апреля 2019

я сделал это другим способом, я поместил ссылку внутри тега формы и отправил форму по ссылке

<form  id="formid" action=  >  http="javascript:document.getElementById("formId".submit()"
</form>
0 голосов
/ 13 апреля 2017

Я попытался использовать подход Саммита выше в Razor, но мне нужно было внести некоторые изменения. Включение имени контроллера в ссылку действия заставило страницу обойти JQuery и напрямую отправить форму. Итак, я попробовал следующее:

@using (Html.BeginForm())...
@Html.ActionLink("ButtonText", "Action", null, null, new { @id = "ButtonID", 
@class = "btn btn-primary btn-sm" })

Оттуда я смог получить доступ к кнопке по идентификатору и использовать метод onclick.

$("#ButtonID").on("click", function (e) {
    url = $(this).attr('href'); // without Action in link url shows as 
                               // /Controller
    e.preventDefault(); // use this or return false

    // now we can do an Ajax submit;

 });

Я должен добавить, что я хотел, чтобы форма была отправлена, но не обязательно хотел перенести ее на другую страницу и / или действие.

0 голосов
/ 22 июня 2016

Это можно сделать, вызвав класс из javascript на C #

 <%= Html.ActionLink("Delete Selected", "DeleteCheckBox", "Domains", "Default.aspx", new { class= "dosubmit" }) %>

Для синтаксиса Razor

@Html.ActionLink("Delete Selected", "Index", "IndexController", "null", new { @class= "dosubmit" })

Затем вызовите Jquery для отправки.

<script type="text/javascript">
$(function() {
    $('dosubmit').click(function(e) {
        e.preventDefault();
        $(this).parents('form').first().submit();
    });
});
</script>

Обновление 1 # Небольшое объяснение, где мы можем использовать это.

<input type="submit" name="dosubmit" value="Submit something" />

Переход к исходному вопросу Ссылка для действия MVC выполнить отправку Index.cshtml пример chtml Просмотр файла

@using(Html.BeginForm("Index","ControllerName",FormMethod.Post))
{
   //  Call another view  <a></a> with bootstrap button class
    @Html.ActionLink("Submit something", "Index", "IndexController", "null", new { @class= "dosubmit btn btn-success"  })
}
// Perform a post submit method with same button
<script type="text/javascript">
$(function() {
    $('dosubmit').click(function(e) {
        e.preventDefault();
        $(this).parents('form').first().submit();
    });
});
</script>
0 голосов
/ 24 июля 2015

если вы используете загрузчик, чтобы кнопка выглядела как ссылка, просто добавьте класс btn-link, например

<input type="submit" name="ActionType" value="Edit" class="col-md-1 btn btn-link" />
...