Кнопка HTML, що викликає контролер MVC та метод дій


204

Я знаю, що це неправильно, але заради ілюстрації я хотів би зробити щось подібне:

<%= Html.Button("Action", "Controller") %>

Моя мета - зробити кнопку HTML, яка викликатиме метод дії мого контролера MVC.


4
Визначте "дзвінок". Це може означати дзвінок AJAX, посилання на іншу сторінку або розміщення форми, щоб назвати кілька можливостей.
3Dave

Більшість відповідей вище, можливо, вже спрацювали, на жаль, жодна не працювала для мене. Я знайшов тут корисну відповідь з іншої публікації Stackoverflow! Він працював для мене на ASP з точковою рамкою 4.7 mvc5 та завантажувальною версією 3. * і звичайно в Razor View. Основна мета питання, як я припускаю, - показати посилання, яке виглядає як кнопка.
Імран Фарукі

Відповіді:


264

Не потрібно використовувати форму взагалі, якщо ви не хочете опублікувати в дії. Кнопка введення (не надсилати) зробить трюк.

  <input type="button"
         value="Go Somewhere Else"
         onclick="location.href='<%: Url.Action("Action", "Controller") %>'" />

1
Я використав цю пропозицію, оскільки для неї не потрібна форма. Дякую!
Аарон Салазар

2
може загорнути його в HtmlHelper щось на кшталтpublic static string ActionButton(this HtmlHelper helper, string action, string controller, string text) { return String.Format("<input type=\"button\" value=\"{0}\" onclick=\"location.href='{1}' />",text,Url.Action(action,controller)); }
Menahem

11
це дає невстановлену постійну помилку в моєму коді
Бурак Каракуш

5
Якщо ви хочете передати параметр з цим, ви можете використовувати<input type="button" value="Go Somewhere Else" onclick="location.href='<%: Url.Action("Action", "Controller", new { parameter1 = value1 }) %>'" />
HowlinWulf

1
<input type = "button" value = "DeleteAll" onclick = "location.href = '@ Url.Action (" DeleteAll "," Home ")'" />
Yuchao Zhou

242

Синтаксис бритви тут:

<input type="button" value="Create" onclick="location.href='@Url.Action("Create", "User")'" />

4
Я все ще отримав помилку "невизначена константа рядка" в IDE, яка все ще не відображалася належним чином. Я повинен був використовувати рішення тут: stackoverflow.com/a/16420877/410937
atconway

1
@atconway - дивно, він працював для мене саме так, як ця відповідь подає його. VS2013.
ametren

6
@atconway - була та сама помилка, але змінив змінив тег з 'input'на, 'button'і це вирішило помилку.
Тоні Старк

6
За допомогою параметрів <input type = "button" title = "Delete" value = "D" onclick = "location.href = '@ Url.Action (" Видалити "," фільми ", новий {id = item.ID})" "/>
Сандіп

у моєму випадку лише використовуючи <button type="button" class="btn btn-primary" onclick="location.href='@Url.Action("action", "controller")'" >Go Somewhere Else</button>трюк
Atiq Baqi

69
<button type="button" onclick="location.href='@Url.Action("MyAction", "MyController")'" />

type = "button" не дозволяє надсилати сторінку. натомість він виконує вашу дію.


16

Спробуйте це:

@Html.ActionLink("DisplayText", "Action", "Controller", route, attribute)

Це має працювати для вас.


Ви також можете використовувати bootstrap або інші класи css, подібні до цього: @ Html.ActionLink ("DisplayText", "Дія", ["Контролер"], routeValues: null, htmlAttributes: new {@ class = "btn btn-info btn-md ", style =" white-space: normal "})
Асаф

15

Ви можете використовувати Url.Action, щоб вказати генерувати URL для дії контролера, щоб ви могли скористатися одним із наступних:

<form method="post" action="<%: Url.Action("About", "Home") %>">
   <input type="submit" value="Click me to go to /Home/About" />
</form>

або:

<form action="#">
  <input type="submit" onclick="parent.location='<%: Url.Action("About", "Home") %>';return false;" value="Click me to go to /Home/About" />
  <input type="submit" onclick="parent.location='<%: Url.Action("Register", "Account") %>';return false;" value="Click me to go to /Account/Register" />
</form>

11

Ось так ви можете подати свою форму на певний контролер та метод дій у Razor.

 <input type="submit" value="Upload" onclick="location.href='@Url.Action("ActionName", "ControllerName")'" />

10

Спираючись на пару вищезазначених відповідей, ви можете це зробити:

<button onclick="location.href='@Url.Action("ActionName", "ControllerName")'" />

6

Елемент HTML <button>може надавати лише зворотний зв'язок із формою, що містить його.

Тому вам потрібно скласти форму, яка POST вводить в дію, а потім помістити форму <button>або <input type="submit" />в форму.


5

У випадку, якщо ви отримуєте помилку як "невстановлена ​​константа рядка", використовуйте наступний синтаксис бритви:

<input type="button" onclick="@("location.href='"+ Url.Action("Index","Test")+ "'")" />


4

Отже, я використовую Razor, але це буде працювати з використанням будь-якого. Я в основному загортаю кнопку в посилання.

<a href="Controller/ActionMethod">
    <input type="button" value="Click Me" />
</a>

4

Коли ви реалізуєте дію в контролері, використовуйте

return View("Index");

або

return RedirectToAction("Index");

де сторінка Index.cshtml (або сторінка, яка генерує дію) вже визначена. В іншому випадку ви, мабуть, зіткнулися з помилкою "перегляд або його майстра не знайдено ...".

Джерело: https://blogs.msdn.microsoft.com/aspnetue/2010/09/17/best-practices-for-asp-net-mvc/


4

Незважаючи на метод onclick, ви також можете використовувати формацію наступним чином:

<button type="submit" id="button1" name="button1" formaction='@Url.Action("Action", "Controller")'>Save</button>

Це краще працює, якщо у вас є дія з атрибутом дієслова HttpPost, це зупинить веб-сканерів від відвідування цих руйнівних посилань (дякую Гектору Кореа за цю інформацію)
Тахір Халід

3

Скористайтеся цим прикладом:

<button name="nameButton" id="idButton" title="your title" class="btn btn-secondary" onclick="location.href='@Url.Action( "Index","Controller" new {  id = Item.id })';return false;">valueButton</button>

1

Якщо ви перебуваєте на домашній сторінці ("/ Home / Index") і хочете зателефонувати в індексну дію контролера адміністратора, наступне буде працювати для вас.

<li><a href="/Admin/Index">Admin</a></li>

1

краще використовувати цей приклад .

Дія виклику та контролер за допомогою ActionLink:

@Html.ActionLink("Submit", "Action", "Controller", route, new { @class = "btn btn-block"})

0

Гаразд, вам в основному потрібно передати дію кнопці та викликати її, коли відбувається натискання, вона не повинна знаходитися всередині з, ви можете використовувати кнопку HTML onclickна кнопці, щоб запустити її, коли натиснути кнопку ...

<button id="my-button" onclick="location.href='@Url.Action("YourActionName", "YourControllerName")'">Submit</button>

0

Ви завжди можете пограти з htmlHelpers і створити деякі речі

    public static IHtmlContent BtnWithAction(this IHtmlHelper htmlHelper, string id, string text, string css="", string action="", string controller="")
    {
        try
        {
            string str = $"<button id=\"{id}\" class=\"{css}\" type=\"button\" ###>{text}</button>";
            if (!string.IsNullOrEmpty(action) && !string.IsNullOrEmpty(controller))
            {                    
                string url = ((TagBuilder)htmlHelper.ActionLink("dummy", action, controller)).Attributes["href"];
                var click = !string.IsNullOrEmpty(url) ? $"onclick=\"location.href='{url}'\"" : string.Empty;
                return new HtmlString(str.Replace("###", click));
            }
            return new HtmlString(str.Replace("###", string.Empty));
        }
        catch (Exception ex)
        {
            Log.Error(ex, ex.Message);
            var fkup = "<script>alert(\"assumption is the mother of all failures\")</script>";
            return new HtmlString(fkup);
        }
    }

А потім на вигляд називайте це так

@Html.BtnWithAction("btnCaretakerBack", "Back", "btn btn-primary float-right", "Index", "Caretakers")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.