FormView не передает значение, содержащееся в строке «runat=server»

StackOverflow https://stackoverflow.com/questions/1715988

Вопрос

У меня есть следующий код в 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" %>' >
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top