Я создаю приложение .NET MVC, у которого есть страница со списком кнопок удаления, по одному для каждого элемента в списке. Проблема, с которой я столкнулась, заключается в том, что переменная «элемент» foreach не видна внутри LoginView, что приводит к следующей ошибке:Почему я не могу использовать переменную итерации в LoginView?
Сообщение об ошибке компилятора: CS0103: имя «элемент» не существует в текущем контексте
Ниже представлена упрощенная версия вида. Ошибка возникает в «новой {ид =} item-id» в LoggedInTemplate - ссылка на «пункт» в ActionLink работает отлично:
<% 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>
<% } %>
Для уточнения проблема не, что модель имеет не был успешно передан в представление. Модель видна как внутри, так и снаружи LoginView. Цикл foreach не представляет проблемы при повторении элементов в модели (которая является списком). Проблема в том, что переменная итерации «item» недоступна из LoginView, хотя исходная модель.
Есть ли способ передать «элемент» через шаблоны LoginView? Или строит LoginViews в пределах foreach, что делает неправильный способ делать что-то?
Есть ли правило определения области, которое предотвращает использование локальных переменных в элементах управления - возможно, потому, что элемент управления отображается в другое время на главной странице?
Я понимаю, что частичные представления обычно являются способом перехода в MVC, но почему правило против пользовательских/пользовательских элементов управления? Это потому, что пользовательские элементы управления делают предположения о Page_Load() и post-back, которые не хранятся в приложении MVC? – ctford
Основная причина этого - область прилагаемой страницы; вы не можете передавать переменные, объявленные в разметке страницы, на любые элементы управления. Это поведение не относится к ASP.NET MVC, но является следствием способа отображения страницы (разметка анализируется и элементы управления отображаются без отношения к любому скрипту, выполняющемуся в разметке). –
Причина, по которой я думаю, что вы должны полностью избегать пользовательских/пользовательских элементов управления, заключается в том, что они обычно не хорошо сочетаются с шаблоном MVC. Они имеют тенденцию смешивать слои и требуют состояния и событий (что не имеет ничего общего с сетью, действительно). Однако во многих случаях это невозможно, но я бы предпочел сделать это надлежащим образом - также избежать таких проблем. –