views:

2126

answers:

4

I need to instantiate some ASP LinkButtons onto an ASP.NET MVC view page. I've tried a few things, and I cant get them to come out right. Heres my most recent incarnation of the code: the aspx file

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

What it renders in Firefox is one instance of the text Link for each member in the collection I'm enumerating, but they arent hyperlinks, just text. The generated HTML looks like this

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

I've tried adding a runat="server" attribuite to each asp:LinkButton tag, but I get a runtime exception that controls can only be put inside a form tag with the runat="server" attribute. Which I think I've already done, so I dont really understand that. Can anyone explain to me what I'm doing wrong, and what I need to do to fix it so that the LinkButtons are actually linky?

+1  A: 

Unfortunately, ASP.NET MVC does not support web forms controls right now. Sorry! :(

You'll have to use a standard HTML link.

JoshJordan
I think that's actually a Good Thing (tm). :)
BobbyShaftoe
@BobbyShaftoe, a good thing on what basis? Normally anything that changes the state of the server should use a POST verb, GET should only be used for retrieving data (those are the recommendations of W3C and they are meant for security). For cosmetic reasons, it's not always possible to use a button, hence the need for LinkButton.
Waleed Eissa
+5  A: 

With ASP.NET MVC you should use Html.ActionLink(...) helper methods (and the like). They provide much richer functionality than LinkButtons.

DreamSonic
A: 

Here is the absolute simplest hardcoded way to put a link in that code (or button, or image, etc.):

 <% foreach (var disc in Model.Title.tblDiscs) %>
    <% { %>
        <li>
            <a href="/mypage?discnumber=<%=disc.ID%>">Link</a>
        </li>
 <% } %>

The Html.ActionLink control will also give you text links:

<% foreach (var disc in Model.Title.tblDiscs) %>
   <% { %>
       <li>
           <%=Html.ActionLink(disc.Name, 
                  "MyDiscController", "MyDiscView", new { id = disc.id}, null)
           %>
       </li>
   <% } %>

But, if you want a button, here is an less-than-ideal HtmlHelper that does exactly what you want.

Peter J
+4  A: 

My guess is that you want to use LinkButton to submit the form using it? If that is the case, I have done something similar and it's something like this:

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

Then handle the submit via jQuery:

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