Objetivo:Ajustar valores por defecto en controles obteniendolos desde la QueryString
Receta:Para ajustar correctamente el valor obteniendolo de la QueryString, hemos de usar javascript.
Hay que tener cuidado al cambiar los ID de los controles desde el sharepoint designer, porque el codigo del DataBind es generado y utiliza funciones con el nombre ff33,ff34,... (ffNUMERO) y se cargará el valor en el control pero al guardar los valores y hacer el commit desde el formActionButton, no se guardan los valores. Por lo que recomiendo usar los nombres que asigna Sharepoint designer si no se entiende bien el codigo.
----
<script type="text/javascript">
// Este Javascript ajusta el valor por defecto de un LookupField// Hay que pegarlo en el NewForm dentro del tag PlaceHolderMain
_spBodyOnLoadFunctionNames.push("fillDefaultValues");
function fillDefaultValues() {
var qs = location.search.substring(1, location.search.length);
var args = qs.split("&"); var vals = new Object();
for (var i=0; i < args.length; i++) {
var nameVal = args[i].split("=");
var temp = unescape(nameVal[1]).split('+');
nameVal[1] = temp.join(' ');
vals[nameVal[0]] = nameVal[1];
}
getTagFromIdentifier("input","idEmpleado").value=vals["IDEMPLEADO"];
// setFieldValueFromFieldName("idEmpleado", vals["IDEMPLEADO"]); Esto funciona bien para los campos Lookup
setFieldValueFromFieldName("IdPuesto", vals["IDNUEVOPUESTO"]);
setLabelValueFromFieldName("lblIdEmpleado", vals["IDEMPLEADO"]);
}
function setFieldValueFromFieldName(fieldName,value){
if (value == undefined) return;
var theSelect = getTagFromIdentifierAndTitle("input","TextField",fieldName); theSelect.value=value;
}
function setLabelValueFromFieldName(fieldName,value){ if (value == undefined) return;
var theSelect = getTagFromIdentifier("span",fieldName);
theSelect.value=value; theSelect.innerText=value; theSelect.Text=value;
}
function setLookupFromFieldName(fieldName, value) {
if (value == undefined) return;
var theSelect = getTagFromIdentifierAndTitle("select","Lookup",fieldName);
// Si el control tiene mas de 20 elementos en la lista se renderiza con ajax por lo que hay que seleccionarlo de otra manera
// ya que se renderiza como input no como select
if (theSelect == null) {
var theInput = getTagFromIdentifierAndTitle("input","",fieldName);
ShowDropdown(theInput.id);
//this function is provided by SharePoint
var opt=document.getElementById(theInput.opt);
setSelectedOption(opt, value); OptLoseFocus(opt);
//this function is provided by SharePoint
} else {
setSelectedOption(theSelect, value);
}
}
function setSelectedOption(select, value) {
var opts = select.options;
var l = opts.length;
if (select == null) return;
for (var i=0; i < l; i++) {
if (opts[i].value == value) {
select.selectedIndex = i;
return true;
}
}
return false;
}
function getTagFromIdentifier(tagName, identifier) {
var len = identifier.length;
var tags = document.getElementsByTagName(tagName);
for (var i=0; i < tags.length; i++) {
var tempString = tags[i].id;
if (identifier == "" tempString.indexOf(identifier) == tempString.length - len) {
return tags[i];
}
}
return null;
}
function getTagFromIdentifierAndTitle(tagName, identifier, title) {
var len = identifier.length;
var tags = document.getElementsByTagName(tagName);
for (var i=0; i < tags.length; i++) {
var tempString = tags[i].id;
if (tags[i].title == title && (identifier == "" tempString.indexOf(identifier) == tempString.length - len)) {
return tags[i];
}
}
return null;
}
function getTagFromTitle(tagName, title) {
var tags = document.getElementsByTagName(tagName);
for (var i=0; i < tags.length; i++) {
if (tags[i].title == title) {
return tags[i];
}
}
return null;
}
function queryString(parameter) {
var loc = location.search.substring(1, location.search.length);
var param_value = false;
var params = loc.split("&");
for (i=0; i<params.length;i++) {
param_name = params[i].substring(0,params[i].indexOf('='));
if (param_name == parameter) {
param_value = params[i].substring(params[i].indexOf('=')+1)
}
}
if (param_value) {
return param_value;
} else {
return false;
//Here determine return if no parameter is found
}
}
</script>
Forma Directa de acceso a QueryString con JSRequest (Nativo en Sharepoint):
<script>JSRequest.EnsureSetup();var itemId = JSRequest.QueryString["PageView"];alert(´Query String - ´ + itemId);itemId = JSRequest.FileName;alert(´Current Page - ´ + itemId); itemId = JSRequest.PathName;alert(´Current Path - ´ + itemId);</script>RECOMENDACIÓN:Si encadenáis listas con lookup usados como clave foránea, os recomiendo renderizar los controles como TEXTBOX en vez de como sharepoint ListFormField ya que seguramente queréis ocultar los campos con ID.De lo contrario veréis como se despliega el combo y a medida que vais teniendo mas datos, se ralentiza la página.
http://www.robertomarcos.com/