为什么我不能在LoginView中使用迭代变量?

时间:2009-09-20 22:39:13

标签: asp.net asp.net-mvc

我正在构建一个.NET MVC应用程序,其中包含一个删除按钮列表的页面,列表中的每个项目都有一个。我遇到的问题是在LoginView中看不到foreach变量“item”,这会导致以下错误:

编译器错误消息:CS0103:当前上下文中不存在名称“item”

以下是该视图的简化版本。错误发生在LoggedInTemplate中的“new {id = item.Id}” - ActionLink中对“item”的引用工作正常:

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

澄清问题是模型尚未成功传递给View。从LoginView内部和外部都可以看到模型。 foreach循环在迭代模型中的项(这是一个List)时没有问题。问题是无法从LoginView中访问迭代变量“item” - 尽管原始模型是。

有没有办法将“item”传递给LoginView的模板?或者在foreach中构建LoginViews循环错误的做事方式?

是否存在阻止在控件中使用局部变量的范围规则 - 可能是因为控件是在与主页不同的时间呈现的?

3 个答案:

答案 0 :(得分:1)

使用ASP.NET MVC你真的不应该使用用户/自定义控件,所以如果省略<asp:LoginView/>并编写一行代码来检查用户是否经过身份验证,那么你就可以了。< / p>

而不是您当前的代码:

<asp:LoginView runat="server">
    <LoggedInTemplate>
        <div>Show this to authenticated users only</div>
    </LoggedInTemplate>
</asp:LoginView>

只需使用if语句和Request.IsAuthenticated的值:

<% if (Request.IsAuthenticated) { %>
    <div>Show this to authenticated users only</div>
<% } %>

答案 1 :(得分:0)

您是否将模型传递给视图,是否还从该视图中的模型继承?

因此,如果这是一个View,那么在您的C#代码中,您需要返回项目列表,如return View(listofitems);

如果这是部分视图,那么<% Html.RenderPartial("MyPartial", listofitems) %>

在视图中你需要

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IQueryable<ListOfItems>>" %>

如果一切就绪,那么它应该不起作用。

答案 2 :(得分:0)

<% foreach (var item in Model) { %>
  <%= Html.ActionLink("Item", "Details", new { id = item.Id })%>
  <%= if( Request.IsAuthenticated ) {
      using( Html.BeginForm( "Delete", "Items", new {id=item.Id}, FormMethod.Post)) 
      { %>
          <input type="submit" value="Delete" runat="server" />
      }
    } %>
<% } %>

没有必要使用LoginView,它并没有真正给你任何东西。请使用类似上面的内容。

或者,您可以决定是否将特定项目的删除选项显示到控制器中,因此不要执行if(Request.IsAuthenticated),而是执行 if(item.ShowDelete) ...假设item的类型是视图模型。另一种选择是使用相同的扩展方法,item.ShowDelete()。我更喜欢前面的,因为可能存在与决定是否显示给定项目的删除相关联的逻辑,因此最好不要在控制器或相关逻辑中使用它。