Кнопка HTML, вызывающая контроллер MVC и метод Action

205

Я знаю, что это неправильно, но для иллюстрации я хотел бы сделать что-то вроде этого:

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

Моя цель - создать кнопку HTML, которая будет вызывать метод действия моего контроллера MVC.

Аарон Салазар
источник
4
Определите «вызов». Это может означать вызов AJAX, ссылку на другую страницу или размещение формы, чтобы назвать несколько возможностей.
3Dave
Большинство ответов выше, возможно, уже сработали, к сожалению, ни один из них не сработал для меня. Я нашел здесь полезный ответ из другого поста Stackoverflow! У меня это работало на ASP с dot net framework 4.7 mvc5 и bootstrap version 3. * и, конечно, в Razor View. Основная цель вопроса, как я полагаю, - показать ссылку, похожую на кнопку.
Имран Фаруки

Ответы:

265

Не нужно использовать форму вообще, если вы не хотите публиковать сообщения в действии. Кнопка ввода (не отправить) сделает свое дело.

  <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 ")'" />
Ючао Чжоу
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 (" Delete "," movies ", new {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)

Это должно работать для вас.

Солнечный Окоро Ава
источник
Вы также можете использовать загрузчик или другие классы CSS, такие как: @ Html.ActionLink ("DisplayText", "Action", ["Controller"], 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")'" />
usefulBee
источник
6

Элемент HTML <button>может только отправить обратно в форму, содержащую его.

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

SLaks
источник
5

В случае, если вы получаете ошибку как «неопределенная строковая константа», используйте следующий синтаксис бритвы:

<input type="button" onclick="@("location.href='"+ Url.Action("Index","Test")+ "'")" />
Гаурав Джоши
источник
5

Несмотря на метод onclick, вы также можете использовать форматирование следующим образом:

<button type="submit" id="button1" name="button1" formaction='@Url.Action("Action", "Controller")'>Save</button>
Рахул Бхат
источник
Это работает лучше, если у вас есть действие с атрибутом глагола HttpPost, оно не позволит веб-сканерам посещать эти деструктивные ссылки (спасибо Гектору Корреа за эту информацию)
Тахир Халид,
5

лучше использовать этот пример

<a href="@Url.Action("Register","Account", new {id=Item.id })"
class="btn btn-primary btn-lg">Register</a>

Алекс Сиела
источник
4

Итак, я использую Razor, но это будет работать, используя либо. Я в основном оборачиваю кнопку в ссылке.

<a href="Controller/ActionMethod">
    <input type="button" value="Click Me" />
</a>
jade290
источник
4

Когда вы реализуете действие в контроллере, используйте

return View("Index");

или

return RedirectToAction("Index");

где страница Index.cshtml (или страница, которая генерирует действие) уже определена. В противном случае вы, вероятно, столкнетесь с ошибкой «представление или его мастер не найден ...».

Источник: https://blogs.msdn.microsoft.com/aspnetue/2010/09/17/best-practices-for-asp-net-mvc/

HappyCoder
источник
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") и хотите вызвать действие Index на контроллере Admin, вам подойдет следующее.

<li><a href="/Admin/Index">Admin</a></li>
Пабитра Даш
источник
1

лучше использовать этот пример .

Вызовите действие и контроллер, используя ActionLink:

@Html.ActionLink("Submit", "Action", "Controller", route, new { @class = "btn btn-block"})
Рахул Раут
источник
0

Хорошо, вам нужно передать действие кнопке и вызывать ее, когда происходит щелчок; оно не обязательно должно быть внутри элемента from, вы можете использовать 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")
Kabindas
источник