我有一个用于查看、编辑和将项目插入 MSSQL 数据库的 FormView。FormView 连接到 LinqDataSource,我使用它的Selecting
事件根据查询字符串中传递的参数(列)过滤 FormView 中显示的数据。
在 FormView 我有一个 DropDownList 显示来自相关表的值。一切正常,除非我尝试编辑 - 由于某种原因,当我尝试保存编辑时,DropDownList 的选定值始终为空(即使我选择了一个值)。插入工作正常。
我已将问题追溯到Selecting
我进行过滤的事件。如果我注释掉执行过滤的方法,它会成功更新项目 - 但我无法弄清楚为什么过滤会破坏更新。
这是我的(缩短的)FormView:
<asp:FormView ID="fvData" runat="server" AllowPaging="True"
DataKeyNames="ID" DataSourceID="ldsData"
ondatabound="fvData_DataBound">
<EditItemTemplate>
<table class="pad5">
<tr>
<td class="field-name">AREA:</td>
<td><asp:DropDownList ID="cboAREA" runat="server" DataTextField="AREA_NAME" DataValueField="AREA1" SelectedValue='<%# Bind("AREA") %>' DataSourceID="ldsAreas" /></td>
</tr>
<tr>
<td class="field-name">LOOP:</td>
<td><asp:TextBox ID="txtLOOP" runat="server" Text='<%# Bind("LOOP") %>' /></td>
</tr>
<tr>
<td class="field-name">LOOP DESCRIPTION:</td>
<td><asp:TextBox ID="txtLOOP_DESCRIPTION" runat="server"
Text='<%# Bind("LOOP_DESCRIPTION") %>' style="width: 600px" /></td>
</tr>
</table>
<asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" CausesValidation="True" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" CausesValidation="False" />
</EditItemTemplate>
<InsertItemTemplate>
<table class="pad5">
<tr>
<td class="field-name">AREA:</td>
<td>
<asp:DropDownList ID="cboAREA" runat="server" DataTextField="AREA_NAME"
DataValueField="AREA1" SelectedValue='<%# Bind("AREA") %>' AppendDataBoundItems="true" DataSourceID="ldsAreas">
<asp:ListItem Text="" Value="" />
</asp:DropDownList>
</td>
</tr>
<tr>
<td class="field-name">LOOP:</td>
<td><asp:TextBox ID="txtLOOP" runat="server" Text='<%# Bind("LOOP") %>' /></td>
</tr>
<tr>
<td class="field-name">LOOP DESCRIPTION:</td>
<td><asp:TextBox ID="txtLOOP_DESCRIPTION" runat="server"
Text='<%# Bind("LOOP_DESCRIPTION") %>' style="width: 600px" /></td>
</tr>
</table>
<asp:Button ID="btnInsert" runat="server" Text="Insert" CommandName="Insert" CausesValidation="True" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" CausesValidation="False" />
</InsertItemTemplate>
</asp:FormView>
LinqDataSource:
<asp:LinqDataSource ID="ldsData" runat="server"
ContextTypeName="E_and_I.EAndIDataDataContext" EnableDelete="True"
EnableInsert="True" EnableUpdate="True" EntityTypeName=""
TableName="INSTRUMENT_LOOP_DESCRIPTIONs" onselecting="ldsData_Selecting" OrderBy="ID ASC" >
</asp:LinqDataSource>
我的ldsData_Selecting
方法:
protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
EI.FilterData<INSTRUMENT_LOOP_DESCRIPTION>(ref e, db.INSTRUMENT_LOOP_DESCRIPTIONs, this.db);
}
最后EI.FilterData
:
public static void FilterData<T>(ref LinqDataSourceSelectEventArgs e, IEnumerable<T> source, EAndIDataDataContext db)
{
if (HttpContext.Current.Request.QueryString.Keys.Count > 0)
{
var result = source.AsQueryable();
bool filtered = false;
// get column names
var columnNames = db.Mapping.MappingSource.GetModel(typeof(EAndIDataDataContext)).GetMetaType(typeof(T)).DataMembers;
foreach (string key in HttpContext.Current.Request.QueryString.Keys)
{
string val = HttpContext.Current.Request.QueryString[key];
// check the query string key exists as a column in the table, etc
if (columnNames.SingleOrDefault(c => c.Name == key) != null && val.Trim() != "" && val != "*")
{
result = result.WhereLike(key, val.Replace("?", "_").Replace("*", "%"));
filtered = true;
}
}
if (filtered)
e.Result = result;
}
}
是否有任何理由过滤结果会破坏更新(并且只有 DropDownList 的 - 文本框工作正常)?过滤工作完美(即,FormView 仅显示用户输入的基于记录的参数);如果您想知道WhereLike
扩展方法的作用,可以查看此问题的答案。