ปุ่ม HTML ที่เรียกใช้ตัวควบคุม MVC และวิธีดำเนินการ


205

ฉันรู้ว่ามันไม่ถูกต้อง แต่เพื่อภาพประกอบฉันต้องการทำสิ่งนี้:

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

เป้าหมายของฉันคือสร้างปุ่ม HTML ที่จะเรียกวิธีการทำงานของคอนโทรลเลอร์ MVC ของฉัน


4
กำหนด "การโทร" นี่อาจหมายถึงการโทร AJAX ลิงก์ไปยังหน้าอื่นหรือโพสต์แบบฟอร์มเพื่อบอกถึงความเป็นไปได้บางอย่าง
3Dave

คำตอบส่วนใหญ่ข้างต้นอาจใช้งานได้แล้ว ฉันพบคำตอบที่เป็นประโยชน์จากโพสต์ Stackoverflow อื่น! มันทำงานกับฉันใน ASP ด้วยกรอบ dot net 4.7 mvc5 และ bootstrap เวอร์ชัน 3 * และแน่นอนใน Razor View วัตถุประสงค์หลักของคำถามที่ฉันคิดคือการแสดงลิงค์ที่ดูเหมือนปุ่ม
Imran Faruqi

คำตอบ:


265

ไม่จำเป็นต้องใช้แบบฟอร์มเลยเว้นแต่ว่าคุณต้องการโพสต์ไปยังการดำเนินการ ปุ่มป้อนข้อมูล (ไม่ส่ง) จะทำการหลอกลวง

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

1
ฉันใช้คำแนะนำนี้เพราะไม่จำเป็นต้องใช้แบบฟอร์ม ขอบคุณ!
Aaron Salazar

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'และที่แก้ไขข้อผิดพลาด
Tony Stark

6
ด้วยพารามิเตอร์ <input type = "button" title = "Delete" value = "D" onclick = "location.href = '@ Url.Action (" ลบ "," ภาพยนตร์ ", ใหม่ {id = item.ID})' "/>
Sandeep

ในกรณีของฉันเพียงแค่ใช้<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", "Action", ["Controller"], เส้นทางค่า: null, htmlAttributes: ใหม่ {@ class = "btn-info btn-md ", style =" white-space: normal "})
Asaf

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

นี่คือวิธีที่คุณสามารถส่งแบบฟอร์มของคุณไปยังตัวควบคุมและวิธีการดำเนินการเฉพาะในมีดโกน

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

10

จากคำตอบข้างต้นสองข้อคุณสามารถทำได้:

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

6

<button>องค์ประกอบHTML สามารถโพสต์กลับไปยังแบบฟอร์มที่มีมันเท่านั้น

ดังนั้นคุณต้องสร้างฟอร์มที่โพสต์ไปยังแอ็คชันจากนั้นใส่<button>หรือ<input type="submit" />ในฟอร์ม


5

ในกรณีที่คุณได้รับข้อผิดพลาดว่า "ค่าคงที่สตริงที่ไม่ถูกทำลาย" ให้ใช้ไวยากรณ์ของมีดโกนต่อไปนี้:

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


4

ดังนั้นฉันใช้มีดโกน แต่จะใช้งานได้เช่นกัน ฉันโดยทั่วไปห่อปุ่มในลิงค์

<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 คุณยังสามารถใช้ formaction ดังนี้:

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

วิธีนี้ใช้ได้ผลดีกว่าถ้าคุณมีแอ็คชั่นที่มีคำกริยา HttpPost มันจะหยุดโปรแกรมรวบรวมข้อมูลเว็บไม่ให้ไปที่ลิงค์ทำลาย (ขอบคุณ Hector Correa สำหรับข้อมูลนี้)
Tahir Khalid

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

หากคุณอยู่ในหน้าแรก ("/ หน้าแรก / ดัชนี") และคุณต้องการเรียกการกระทำดัชนีของตัวควบคุมผู้ดูแลระบบต่อไปนี้จะทำงานให้คุณ

<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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.