문제

FormView의 editEtemTemplate에 다음 코드가 있습니다.

<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% 바인딩되어 비즈니스 로직 계층으로 올바르게 전달됩니다. 그러나 위의 코드의 경우 값이 0으로 전달됩니다.

누구든지 이것이 왜 그런지 또는 어떻게 돌아가는지 말해 줄 수 있습니까? 관리자 또는 일반 사용자가 편집 할 것인지 여부에 따라이 테이블 행을 숨겨야하는 컨트롤입니다. IE : 일부 필드는 관리자 만 쓸 수 있으며 사용자가 관리자가 아닌 경우 뷰에서 컨트롤을 숨기고 싶습니다.

도움이 되었습니까?

해결책 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에 액세스 할 수 있습니다.이를 통해 비행중인 동안 및 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 = 서버 속성을 제거하십시오

CSS 클래스를 정의하십시오

.hidden{ display:hidden;}

그런 다음 사용자가 관리자인지 아닌지에 따라 클래스 속성을 설정합니다.

<tr class='<%= if(IsUserAdmin) "" else "hidden" %>' >
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top