2009-05-18 20 views
10

Potrzebuję utworzyć instancję niektórych LinkButtons ASP na stronie widoku MVC ASP.NET. Wypróbowałem kilka rzeczy i nie mogę ich zmusić do wyjścia. Herezje moja najnowsza inkarnacja kodu: plik aspxLinkButton w ASP.NET MVC

<body> 
<% using (Html.BeginForm("TitleDetail", "Movies", FormMethod.Post, new{runat="server"})) { %> 

    <ul> 
    <% foreach (var disc in Model.Title.tblDiscs) %> 
    <% { %> 

     <li> 
      <asp:LinkButton ID="Play">Link</asp:LinkButton> 
     </li> 
    <% } %> 
    </ul> 
<% } %> 
</body> 

Co to świadczy Firefox to jedna instancja Text Link dla każdego członka w kolekcji mam wymieniającym, ale oni nie hiperłącza, tylko tekst . Wygenerowany HTML wygląda tak

<form action="/MyMovies/TitleDetail/239" method="post" runat="server">test title <br /> 

    <ul> 
     <li> 

      <asp:LinkButton ID="Play">Link</asp:LinkButton> 
     </li> 

     <li> 
      <asp:LinkButton ID="Play">Link</asp:LinkButton> 
     </li> 

     <li> 
      <asp:LinkButton ID="Play">Link</asp:LinkButton> 

     </li> 

    </ul> 

Próbowałem dodając runat = „server” attribuite do każdego tagu asp: LinkButton, ale pojawia się wyjątek czasu wykonywania, że ​​kontrole mogą być wprowadzane wyłącznie wewnątrz tag formularza z atrybutem runat = "server". Co myślę, że już zrobiłem, więc naprawdę tego nie rozumiem. Czy ktoś może mi wyjaśnić, co robię źle, i co muszę zrobić, aby to naprawić, aby LinkButtons były rzeczywiście połączone?

Odpowiedz

7

z ASP.NET MVC należy użyć Html.ActionLink(...) metody pomocnika (i podobne). Zapewniają one znacznie bogatszą funkcjonalność niż LinkButtons.

2

Niestety, program ASP.NET MVC nie obsługuje teraz formantów formularzy internetowych. Przepraszam! :(

Będziesz musiał użyć standardowego łącza HTML.

+12

myślę, że rzeczywiście Dobra rzecz (tm). :) – BobbyShaftoe

+1

@BobbyShaftoe, dobra rzecz na jakiej podstawie? Zwykle wszystko, co zmienia stan serwera, powinno wykorzystywać czasownik POST, GET powinien być używany tylko do pobierania danych (są to zalecenia W3C i są przeznaczone dla bezpieczeństwa). Ze względów kosmetycznych nie zawsze można użyć przycisku, stąd potrzeba LinkButton. –

15

Domyślam się, że chcesz użyć LinkButton przesłać formularz używając go Jeśli jest to sprawa, mam zrobić coś podobnego i to jest coś takiego:

<% using (Html.BeginForm("TitleDetail", "Movies", 
    FormMethod.Post, new{ id = "MyForm", name = "MyForm" })) { %>  
<ul> 
    <% foreach (var disc in Model.Title.tblDiscs) { %> 
     <li> 
      <a class="do-something-link" href="javascript:void(0);">Click</a> 
     </li> 
    <% } %> 
</ul> 
<% } %> 

Następnie obsłużyć złożyć poprzez jQuery:

$(document).ready(function(){ 
    $("a.do-something-link").click(function(ev) { 
     ev.preventDefault(); 
     $("#MyForm").submit(); 
    }); 
}); 
2

Napisałem dość prostą metodę rozszerzenia. Zapraszam do poprawy w tej sprawie (to wszystko co potrzebne):

public static IHtmlString ActionButton(this UrlHelper urlHelper, string buttonText, 
    string actionName) 
{ 
    var html = string.Format("<input type=\"button\" value=\"{0}\" " + 
     "onclick=\"window.location = '{1}'\"/>", 
     buttonText, urlHelper.Action(actionName)); 

    return new HtmlString(html); 
} 

A w widoku nazwać tak:

@Url.ActionButton("Button Text", "ActionMethod")