Botão HTML que chama um método MVC Controller and Action

205

Eu sei que isso não está certo, mas para fins de ilustração, eu gostaria de fazer algo assim:

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

Meu objetivo é criar um botão HTML que chame o método de ação do meu controlador MVC.

Aaron Salazar
fonte
4
Defina "chamada". Isso pode significar uma chamada AJAX, um link para outra página ou postar um formulário, para citar algumas possibilidades.
3Dave
A maioria das respostas acima pode já ter funcionado, infelizmente nenhuma funcionou para mim. Encontrei aqui uma resposta útil de outro post do Stackoverflow! Funcionou para mim no ASP com o dot net framework 4.7 mvc5 e na versão 3. do bootstrap e, é claro, no Razor View. O principal objetivo da pergunta, como suponho, é mostrar um link que se parece com um botão.
Imran Faruqi

Respostas:

265

Não é necessário usar um formulário, a menos que você queira postar na ação. Um botão de entrada (não enviar) fará o truque.

  <input type="button"
         value="Go Somewhere Else"
         onclick="location.href='<%: Url.Action("Action", "Controller") %>'" />
Cheddar
fonte
1
Eu usei essa sugestão porque ela não requer um formulário. Obrigado!
Aaron Salazar
2
pode envolvê-lo em um HtmlHelper algo comopublic 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
dá unterminated erro string constante no meu código
Burak Karakuş
5
Se você quiser passar um parâmetro com isso, você pode usar<input type="button" value="Go Somewhere Else" onclick="location.href='<%: Url.Action("Action", "Controller", new { parameter1 = value1 }) %>'" />
HowlinWulf 30/07
1
<input type = "button" value = "DeleteAll" onclick = "location.href = '@ Url.Action (" DeleteAll "," Home ")'" />
Yuchao Zhou
242

A sintaxe do Razor está aqui:

<input type="button" value="Create" onclick="location.href='@Url.Action("Create", "User")'" />
Babul Mirdha
fonte
4
Ainda recebi um erro "constante de seqüência não terminada" no IDE que ainda não era renderizado corretamente. Eu tive que usar a solução a partir daqui: stackoverflow.com/a/16420877/410937
atconway
1
@ atconway - estranho, funcionou para mim exatamente como esta resposta a apresenta. VS2013.
22614 ametren #
6
@ atconway - teve o mesmo erro, mas mudou a tag alterada de 'input'para 'button'e isso resolveu o erro.
Tony Stark
6
Com parâmetros <input type = "button" title = "Delete" value = "D" onclick = "location.href = '@ Url.Action (" Delete "," movies ", new {id = item.ID})' "/>
Sandeep
no meu caso apenas usando <button type="button" class="btn btn-primary" onclick="location.href='@Url.Action("action", "controller")'" >Go Somewhere Else</button>fez o truque
Atiq Baqi
69
<button type="button" onclick="location.href='@Url.Action("MyAction", "MyController")'" />

type = "button" impede o envio da página. em vez disso, executa sua ação.

Amir Chatrbahr
fonte
16

Tente o seguinte:

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

Isso deve funcionar para você.

Sunny Okoro Awa
fonte
você também pode usar o bootstrap ou outras classes css como esta: @ Html.ActionLink ("DisplayText", "Action", ["Controller"], routeValues: null, htmlAttributes: new {@ class = "btn btn-info btn-md ", style =" espaço em branco: normal "})
Asaf
15

Você pode usar Url.Action para especificar gerar a URL para uma ação do controlador, para usar um dos seguintes:

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

ou:

<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>
Jon Galloway
fonte
11

É assim que você pode enviar seu formulário para um controlador e método de ação específicos no Razor.

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

Com base nas respostas acima, você pode fazer o seguinte:

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

O HTML <button> elemento pode postar apenas no formulário que o contém.

Portanto, você precisa criar um formulário que poste para a ação e, em seguida, colocar um <button>ou <input type="submit" />no formulário.

SLaks
fonte
5

Caso esteja recebendo um erro como "constante de sequência não terminada", use a seguinte sintaxe:

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

Apesar do método onclick, você também pode usar a formação da seguinte maneira:

<button type="submit" id="button1" name="button1" formaction='@Url.Action("Action", "Controller")'>Save</button>
Rahul Bhat
fonte
Isso funciona melhor se você tiver uma ação com um HttpPost verbo atributo que vai parar crawlers de visitar esses links destrutivos (graças a Hector Correa para esta informação)
Tahir Khalid
5

é melhor usar este exemplo

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

Alex Siela
fonte
4

Então, eu estou usando Razor, mas isso vai funcionar usando qualquer um. Estou basicamente quebrando um botão em um link.

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

Use este exemplo:

<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>
Mohamed Wardan
fonte
1

Se você estiver na página inicial ("/ Página inicial / Índice") e desejar chamar a ação Index do Admin controller, o seguinte funcionaria para você.

<li><a href="/Admin/Index">Admin</a></li>
Pabitra Dash
fonte
1

é melhor usar este exemplo .

Chame a ação e o controlador usando um ActionLink:

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

OK, você basicamente precisa passar a ação para o botão e chamá-lo quando o clique acontece, ele não precisa estar dentro de um from, você pode usar o botão HTML onclickon para acioná-lo quando o botão for clicado ...

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

Você sempre pode brincar com os htmlHelpers e criar algumas coisas

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

E então, na vista, chame assim

@Html.BtnWithAction("btnCaretakerBack", "Back", "btn btn-primary float-right", "Index", "Caretakers")
Kabindas
fonte