FormView не передает значение, содержащееся в строке "runat = server" - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть следующий код в 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 ]

1 голос
/ 12 ноября 2009

Если безопасность - проблема, возможно, это могло бы работать лучше

<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

0 голосов
/ 13 ноября 2009

Похоже, что эта функциональность задуманна, хотя это не совсем подтверждено.

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;
    }
}
0 голосов
/ 11 ноября 2009

Сделайте выстрел в это:

Удалить атрибут runat = server

Определить класс CSS

.hidden{ display:hidden;}

Затем установите атрибут класса в зависимости от того, является ли пользователь администратором

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
...