我正在构建一个.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循环错误的做事方式?
是否存在阻止在控件中使用局部变量的范围规则 - 可能是因为控件是在与主页不同的时间呈现的?
答案 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()。我更喜欢前面的,因为可能存在与决定是否显示给定项目的删除相关联的逻辑,因此最好不要在控制器或相关逻辑中使用它。