FormView не передает значение, содержащееся в строке «runat=server»
-
19-09-2019 - |
Вопрос
У меня есть следующий код в EditItemTemplate моего FormView:
<tr id="primaryGroupRow" runat="server">
<td class="Fieldname">Primary Group:</td>
<td><asp:DropDownList ID="iPrimaryGroupDropDownList" runat="server" DataSourceID="GroupDataSource" CssClass="PageText"
DataTextField="sGroupName" DataValueField="iGroupID" SelectedValue='<%# Bind("iPrimaryGroup") %>'></asp:DropDownList></td>
</tr>
Если я удалю runat="server" для строки таблицы, то поле iPrimaryGroup будет привязано на 100% и правильно передано на уровень бизнес-логики.Однако в случае с приведенным выше кодом он передается со значением, равным нулю.
Может кто-нибудь сказать мне, почему это так или как это обойти?Это элемент управления, который должен скрыть эту строку таблицы в зависимости от того, редактирует ли ее администратор или обычный пользователь.то есть:некоторые поля доступны для записи только администратору, и я бы хотел скрыть элементы управления из представления, если пользователь не является администратором.
Решение 3
Похоже, что эта функциональность задумана специально, хотя это точно не подтверждено.
http://weblogs.asp.net/rajbk/archive/2009/08/03/formview-binding-gotcha.aspx
Если при использовании объекта FormView у вас есть вложенный элемент управления, двусторонняя привязка данных не будет работать должным образом.Вы можете получить доступ к элементам управления в коде и получить доступ к данным, но они просто не будут автоматически обновлять значение на внутренней стороне вашего уровня бизнес-логики (BLL), как это должно быть.
К счастью, есть обходной путь.Чтобы заставить его работать, нужно создать событие для ItemUpdating.Там будет такая подпись:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
Это дает вам доступ к FormViewUpdateEventArgs, что, в свою очередь, позволяет вам вносить изменения в значения ObjectDataSource, пока они находятся в работе и до того, как они попадут в ваш код BLL, следующим образом:
protected void frmProfile_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
if (frmProfile.FindControl("iPrimaryGroupDropDownList") != null)
{
DropDownList iPrimaryGroupDropDownList = ((DropDownList)frmProfile.FindControl("iPrimaryGroupDropDownList"));
e.NewValues["iPrimaryGroup"] = iPrimaryGroupDropDownList.Text;
}
}
Другие советы
Если безопасность вызывает беспокойство, возможно, это сработает лучше.
<tr>
<td colspan='2'>
<asp:panel runat='server' visible='<%= IsUserAdmin %>'>
<table>
<tr>
<td class="Fieldname">Primary Group:</td>
<td><asp:DropDownList ID="iPrimaryGroupDropDownList" runat="server" DataSourceID="GroupDataSource" CssClass="PageText" DataTextField="sGroupName" DataValueField="iGroupID" SelectedValue='<%# Bind("iPrimaryGroup") %>'></asp:DropDownList>
</td>
</tr>
</table>
</asp:panel>
</td>
Если я не ошибаюсь, никакая разметка на панели не будет отображаться, если видимый = false
Попробуйте это:
Удалите атрибут runat=server.
Определить класс CSS
.hidden{ display:hidden;}
Затем установите атрибут класса в зависимости от того, является ли пользователь администратором.
<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >