2009-05-18 63 views
10

Necesito crear una instancia de algunos botones de enlace ASP en una página de vista ASP.NET MVC. Intenté algunas cosas, y no puedo hacer que salgan bien. Aquí está mi más reciente encarnación del código: el archivo aspxLinkButton en 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> 

Lo que hace que en Firefox es una instancia del texto del vínculo para cada miembro de la colección que estoy enumerando, pero que pueden no estar hipervínculos, texto que se acaba . El HTML generado se parece a esto

<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> 

He intentado añadir un runat = attribuite "servidor" a cada asp: Etiqueta LinkButton, pero me da una excepción de ejecución que controla sólo se puede poner dentro de una etiqueta de formulario con el atributo runat = "server". Lo cual creo que ya hice, así que no entiendo eso. ¿Puede alguien explicarme qué estoy haciendo mal y qué debo hacer para solucionarlo y que los LinkButtons sean realmente linky?

Respuesta

7

con ASP.NET MVC se debe utilizar Html.ActionLink(...) métodos auxiliares (y similares). Ellos proporcionan una funcionalidad mucho más rica que LinkButtons.

2

Desafortunadamente, ASP.NET MVC no admite controles de formularios web en este momento. ¡Lo siento! :(

Vas a tener que utilizar un enlace HTML estándar.

+12

creo que es realmente una buena cosa (tm). :) – BobbyShaftoe

+1

@BobbyShaftoe, una buena cosa sobre qué base? Normalmente, cualquier cosa que cambie el estado del servidor debe usar un verbo POST, GET solo debe usarse para recuperar datos (esas son las recomendaciones del W3C y están destinadas a la seguridad). Por razones estéticas, no siempre es posible usar un botón, de ahí la necesidad de LinkButton. –

15

mi conjetura es que desea utilizar LinkButton para enviar el formulario de usarlo Si ese es el caso, he hecho algo similar y es algo como esto:?

<% 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> 
<% } %> 

Luego manipule el presente a través de jQuery:

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

Escribí un método de extensión un tanto tosco. Se sienten libres de mejorar esto (es todo lo que necesitaba):

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

Y en la vista, lo llaman así:

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