Paso 2: Agregar el código al elemento web de búsqueda personalizado
El elemento web de búsqueda personalizado que se describe en este tutorial genera una consulta de búsqueda de sintaxis SQL basada en las entradas de usuario, y la envía al componente Enterprise Search. A continuación, el elemento web convierte los resultados de búsqueda en XML y aplica una transformación XSLT para mostrar los resultados en el explorador.
El paso 2 describe el código que debe agregar al elemento web.
Nota
La transformación XSLT se trata en Paso 3: Crear el código de transformación XSLT.
Para modificar el código predeterminado en SearchProducts
Agregue las siguientes directivas de espacio de nombres cerca de la parte superior del código en SearchProducts.cs.
using System.Web.UI.WebControls.WebParts; using Microsoft.Office.Server.Search.Query; using Microsoft.SharePoint; using System.Data; using System.Xml; using System.Xml.Xsl; using System.IO;
En la siguiente línea de código, reemplace WebControl por System.Web.UI.WebControls.WebParts.WebPart.
public class SearchProducts : WebControl
Agregue la siguiente línea de código sobre la declaración de clase para SearchProducts.
[XmlRoot(Namespace = "SearchBDCWebPart")]
Ahora puede escribir el código para consultar al componente de búsqueda y representar el contenido del elemento web.
Para agregar los controles secundarios del elemento web y representarlos
Agregue el siguiente código debajo de la declaración de clase.
Table table; Label lblID; TextBox txtID; CompareValidator checkID; Label lblName; TextBox txtName; Button cmdSearch; Label lblResults; Xml xmlResults; Panel xmlPanel;
Reemplace el método CreateChildControls mediante el siguiente código.
protected override void CreateChildControls() { Controls.Clear(); //Create a table control to use for positioning the controls table = new Table(); table.Width = Unit.Percentage(100); for(int i =0; i<5; i++) { TableRow row= new TableRow(); TableCell cell = new TableCell(); row.Cells.Add(cell); table.Rows.Add(row); } //Create the controls for ProductID input lblID = new Label(); lblID.Text = "Product ID is:"; lblID.Width = Unit.Pixel(150); txtID = new TextBox(); txtID.ID = "txtID"; /* The CompareValidator control is used here to validate that the value entered for ProductID is an integer */ checkID = new CompareValidator(); checkID.ControlToValidate = "txtID"; checkID.Operator = ValidationCompareOperator.DataTypeCheck; checkID.Type = ValidationDataType.Integer; checkID.Text = "ProductID must be an integer."; //Add the controls for the ProductID to the table table.Rows[0].Cells[0].Controls.Add(lblID); table.Rows[0].Cells[0].Controls.Add(txtID); table.Rows[0].Cells[0].Controls.Add(checkID); table.Rows[0].Cells[0].Height = Unit.Pixel(40); //Create the controls for Product Name input. lblName = new Label(); lblName.Text = "Product Name contains:"; txtName = new TextBox(); //Add the controls for the Product Name to the table table.Rows[1].Cells[0].Controls.Add(lblName); table.Rows[1].Cells[0].Controls.Add(txtName); table.Rows[1].Cells[0].Height = Unit.Pixel(40); //Create the search button and add to the table control cmdSearch = new Button(); cmdSearch.Click += new EventHandler(cmdSearch_Click); cmdSearch.Text = "Search Products"; table.Rows[3].Cells[0].Controls.Add(cmdSearch); table.Rows[3].Cells[0].Height = Unit.Pixel(40); //Create a label to display the search message lblResults = new Label(); table.Rows[4].Cells[0].Controls.Add(lblResults); table.Rows[4].Cells[0].Height = Unit.Pixel(40); //Add the table to the controls collection }
Agregue un evento de clic para cmdSearch mediante el siguiente código.
void cmdSearch_Click(object sender, EventArgs e) { string strName = txtName.Text; string strID = txtID.Text; /* Validate that the user entered something. If not, prompt the user to enter an ID or search term. */ if (strName == "" & strID == "") { lblResults.Text = "You must enter a Product ID or a Product name term for the Product Search."; } else { returnResults(buildSQL(strName, strID)); } }
Ahora puede agregar el código para construir el texto de consulta de búsqueda mediante la Referencia de sintaxis SQL del motor de búsqueda Enterprise Search.
Para generar la consulta de búsqueda de texto completa
Agregue el siguiente código a la clase ProductSearch:
private string buildSQL(string stName, string stID) { //This is the scope ID for the AdventureWorks //Business Data Catalog application string BDCscopeID = "4"; //Use the StringBuilder class for the syntax string StringBuilder sbSQL = new StringBuilder(); sbSQL.Append("SELECT ProductName,ProductID,ProductNumber,Path FROM SCOPE() WHERE scope='"); sbSQL.Append(BDCscopeID); sbSQL.Append("'"); if (stName != "") { sbSQL.Append(" AND CONTAINS(ProductName,'"); sbSQL.Append(stName); sbSQL.Append("')"); } if (stID != "") { sbSQL.Append(" AND ProductID="); sbSQL.Append(stID); } return sbSQL.ToString(); }
Ahora puede agregar el código para tener acceso al modelo de objetos de consulta. Este ejemplo de código usa la clase Microsoft.Office.Server.Search.Query.FullTextSqlQuery para ejecutar la consulta de búsqueda, al pasar el objeto SPSite para el valor del parámetro.
El ejemplo tiene acceso a los resultados en formato XML mediante el método WriteXml de la clase DataSet. El XML de resultados se pasa al control web XML que transforma el XML, mediante una versión modificada de la transformación XSLT desde el elemento web de resultados de búsqueda principal.
Para ejecutar la consulta de búsqueda de texto completo
Agregue el siguiente código a la clase ProductSearch:
private void returnResults(string strSQL) { try { /* Create the XML control to use for displaying the results, and the Panel control to use as a container for the XML control. */ xmlPanel = new Panel(); xmlResults = new Xml(); xmlPanel.Controls.Add(xmlResults); Controls.Add(xmlPanel); HttpContext context = HttpContext.Current; //Specify the path for the XSL string path = context.Request.MapPath("/_layouts/productXSL.xsl"); //Replace <siteName> with the name of your site string sPath = "http://<siteName>"; FullTextSqlQuery sqlQuery = new FullTextSqlQuery(new SPSite(sPath)); //Specify result type to return sqlQuery.ResultTypes = ResultType.RelevantResults; //Specify the full text search query string sqlQuery.QueryText = strSQL; //Return the search results to a ResultTableCollection ResultTableCollection results = sqlQuery.Execute(); //Create a ResultTable for the relevant results table ResultTable relResults = results[ResultType.RelevantResults]; //Count the number of rows in the table; 0 = no search results int x = relResults.RowCount; if (x !=0) { lblResults.Text = x.ToString(); DataTable dtresults = new DataTable(); dtresults.TableName = "Result"; dtresults.Load(relResults, LoadOption.OverwriteChanges); StringWriter writer = new StringWriter(); DataSet ds = new DataSet("All_Results"); ds.Tables.Add(dtresults); ds.WriteXml(writer, XmlWriteMode.IgnoreSchema); XmlDocument doc = new XmlDocument(); doc.LoadXml(writer.ToString()); XslTransform trans = new XslTransform(); trans.Load(path); xmlResults.Document = doc; xmlResults.Transform = trans; } else { //Send XML for an empty result set to the XML control XmlDocument doc = new XmlDocument(); doc.LoadXml("<All_Results></All_Results>"); XslTransform trans = new XslTransform(); trans.Load(path); xmlResults.Document = doc; xmlResults.Transform = trans; } } catch (Exception ex1) { lblResults.Text = ex1.ToString(); } }
Puede buscar el código completo para el ejemplo de clase SearchProducts en Muestra: código de ejemplo de clase de elemento web de búsqueda de AdventureWorks.
Vea también
Otros recursos
Tutorial: Crear un elemento web de ASP.NET para el ejemplo de aplicación de datos profesionales de AdventureWorks
Paso 1: Configurar el proyecto para el elemento web de búsqueda personalizada
Paso 3: Crear el código de transformación XSLT
Paso 4: Implementar el elemento web personalizado de búsqueda
Paso 5: Probar el elemento web del Catálogo de datos profesionales de la búsqueda