I am building a .NET MVC app that has a page with a list of delete buttons, one for each item in a list. The problem I’m having is that the foreach variable “item” is not visible inside the LoginView, which results in the following error:
Compiler Error Message: CS0103: The name ‘item’ does not exist in the current context
Below is a simplified version of the view. The error occurs at the “new {id=item.Id}” in the LoggedInTemplate – the reference to “item” in the ActionLink works fine:
<% foreach (var item in Model) { %>
<%= Html.ActionLink("Item", "Details", new { id = item.Id })%>
<asp:LoginView runat="server">
<LoggedInTemplate>
<% using( Html.BeginForm( "Delete", "Items", new {id=item.Id}, FormMethod.Post))
{ %>
<input type="submit" value="Delete" runat="server" />
<% } %>
</LoggedInTemplate>
</asp:LoginView>
<% } %>
To clarify the problem is not that the Model has not been successfully passed to the View. The Model is visible from both inside and outside the LoginView. The foreach loop as no problem in iterating through the items in the Model (which is a List). The problem is that the iteration variable “item” is not accessible from within the LoginView – though the original Model is.
Is there any way to pass “item” through to the LoginView’s templates? Or is building LoginViews within a foreach loops the wrong way of doing things?
Is there a scoping rule that prevents using local variables within controls – perhaps because the control is rendered at a different time to the main page?
With ASP.NET MVC you really shouldn’t use user/custom controls, so if you omit the
<asp:LoginView/>and write a line of code to check if the user is authenticated, you are good to go.Instead of your current code:
Just use an if-statement and the value of
Request.IsAuthenticated: