FormView는 "runat = server"행에 포함 된 값을 전달하지 않습니다.
-
19-09-2019 - |
문제
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" %>' >