Despues de tratar muchas cosas, como por ejemplo Request.Files, HttpContext.Request.Files, encontre la forma de obtener o mejor dicho accesar por completo un file upload en un action de un controller.
La manera mas simple de manejar un file en el action de un controller es usando HttpPostedFileBase type:
public ActionResult ImporFile(HttpPostedFileBase file)
{
// Do things with the file here like
/*
var fullPathFile = file.FileName;
var sr = new StreamReader(file.InputStream,Encoding.UTF8);
var filas = 0;
while (sr.ReadLine() != null) { ++filas; }
sr.Close();
*/
return View();
}
Ahora si en base al codigo html te preguntas ¿Cómo debo hacer para añadir enctype=”multipart/form-data” a un form que es generado usando <%Html.BeginForm();%>?
La respuesta es: como parte de los htmlAttributes,Ej.
Html.BeginForm(action,controller, FormMethod.Post, new { enctype="multipart/form-data"})
Esta funcion reemplaza el primer match de findstring con newstring en stringObject. Pero ¿como reemplazar todos los caracteres que conocuerden con findstring?, para ello se pueden utilizar 2 parametros de la función replace:
g utizado para encontrar todos los match de findstring en stringObject
i utilizado para que sea una busqueda “icasesensitive”
Otra forma de reemplazar todos los caracteres que conocuerden con findstring es mediante un ciclo iterativo el cual verán en el código.
Código de función que obtiene el nombre del archivo
function GetFileName() {
var fullFileName = $("#file").val();
var fileName = fullFileName.substr(fullFileName.lastIndexOf("\\") + 1, fullFileName.length);
return fileName;
}
Código de función que obtiene la extensióndel archivo
function GetExtension() {
var fileName = GetFileName();
var fileEx = fileName.substr(fileName.lastIndexOf("."), fileName.length);
return fileEx;
}
Código que realiza el Replace
$(document).ready(function() {
$("#btnReplace").click(function () {
var txtData = $("#txtData").val();
var txtRemp = $("#txtRemp").val();
var txtCaracter = $("#txtCaracter").val();
var fileName = GetFileName();
var fileEx = GetExtension();
//replace "." en fileName
fileName = fileName.replace(fileEx, '').replace(/\x2E/g, '') + fileEx;
//replace txtRemp con txtCaracter en txtData
/*
solucion para todos los navegadores excepto iexplorer
txtData = txtData.replace(txtRemp,txtCaracter,'gi');
*/
//solucion para todos los navegadores incluido iexplorer
var intIndexOfMatch = txtData.indexOf(txtRemp);
while (intIndexOfMatch != -1){
txtData = txtData.replace(txtRemp,txtCaracter)
intIndexOfMatch = txtData.indexOf(txtRemp);
}
$("#replace1").html(txtData);
$("#replace2").html(fileName);
});
});
Un par de consideraciones:
Cuando reemplazo el punto uso una expresion regular con el valor hexadecimal del caracter “.” seguido con el parametro g para reemplazarlo en todo el nombre del archivo.
La sintaxis stringObject.replace(findstring,newstring,parameters) no es reconocida en IExplorer
Hace mucho rato que no trabajaba con un menu recursivo, desde que trabaje en Tajamar/Travel Security que no veia uno , pero en un proyecto reciente tuve que volver a generar un menu recursivamente y aqui dejo respaldo de la logica base usada.
En resumen se trata de generar una lista recursiva de items con una estructura como la siguiente:
Modulo 1
Opcion 1
Opcion 2
Modulo 2
SubModulo 2
Opcion 3
Opcion 4
Opcion 5
Modulo 3
Opcion 6
Opcion 7
Para lo anterior tengo dos clases, una con la estructura de la tabla de la base de datos que maneja la info de los objetos del menu del sistema, y otra clase que usare solo para generar la lista recursiva anteriormente mencionada.
public class SecObjeto
{
public Int32 IdObjeto { get; set; }
public Int32 IdPadre { get; set; }
public String Controller { get; set; }
public String Action { get; set; }
public String NombreModulo { get; set; }
public SecObjeto(){ }
public SecObjeto(int idobjeto, int idpadre, string controller, string action, string nombremodulo)
{
IdObjeto = idobjeto;
IdPadre = idpadre;
Controller = controller;
Action = action;
NombreModulo = nombremodulo;
}
}
public class MenuList
{
public String UrlView { get; set; }
public String Name { get; set; }
public List<MenuList> SubMenu { get; set; }
public MenuList(string urlview,string name,List<MenuList> submenu)
{
UrlView = urlview;
Name = name;
SubMenu = submenu;
}
}
public static List<MenuList> GenerarMenu(List<SecObjeto> secObjetos)
{
var menuList = new List<MenuList>();
foreach (var sObj in secObjetos)
{
//0 indica que se trata de un nodo padre
if (sObj.IdPadre == 0)
{
//uri para accesar una view bajo el patron mvc
var urlAction = sObj.Controller + "/" + sObj.Action;
menuList.Add(new MenuList(urlAction, sObj.NombreModulo, GenerarSubMenu(secObjetos, sObj)));
}
}
return menuList;
}
public static List<MenuList> GenerarSubMenu(List<SecObjeto> secObjetos, SecObjeto sObj)
{
var menuList = new List<MenuList>();
foreach (var objeto in secObjetos)
{
//la igualdad indica que objeto es hijo de sObj
if (objeto.IdPadre == sObj.IdObjeto)
{
var urlAction = objeto.Controller + "/" + objeto.Action;
menuList.Add(new MenuList(urlAction, objeto.Descripcion, GenerarSubMenu(secObjetos, objeto)));
}
}
return menuList;
}
Con esto ya tengo una lista recursiva (List) con todo lo necesario para generar mi menu con html,jquery y css por ejemplo .
Honey, It’s been a long time coming
And I can’t stop now
Such a long time running
And I can’t stop now
Do you hear my heart beating
Can you hear that sound
Cause I can’t help thinking
And I don’t look down
And then I looked up at the sun and I could see
Oh the way that gravity turns for you and me
And then I looked up at the sky and saw the sun
And the way that gravity pulls on everyone, on everyone
Baby, It’s been a long time waiting
Such a long, long time
And I can’t stop smiling
No I can’t stop now
And do you hear my heart beating
And can you hear that sound
Cause I can’t help crying
And I won’t look down
And then I looked up at the sun and I could see
Oh the way that gravity turns on you and me
And then I looked up at the sun and saw the sky
And the way that gravity pulls on you and I, on you and I
Can you hear my heart beating
Can you hear that sound
Cause I can’t help crying
And I wont look down
Para poder realizar un export e import de un esquema determinado en una base de datos Oracle 9i necesitas realizar lo siguiente en el servidor de base de datos.
En una consola de windows ejecutamos lo siguiente: c:\>exp test1/test1@desa_db FILE=data_test1.dmp LOG=data_test1.log
Con esto hemos exportado el esquema completo test1 el cual esta asociado al usuario test1. Este esquema ha quedado en un archivo .dmp que en nuestro caso se llama data_test1.dmp y ademas hemos generado un .log para ver todos los export generados en el archivo.
Ahora vamos a realizar el import de este archivo en un nuevo esquema que debe haber sido creado con anterioridad. En mi caso he creado el usuario test2 y le he dado los privilegios necesarios (casi dba) y con esta creacion de usuario ya tenemos un nuevo esquema en nuestra base de datos llamado test2, el cual no contiene ningun objeto aun.
Entonces realizamos el import de la siguiente manera: c:\>imp test1/test1@desa_db FILE=data_test1.dmp LOG=data_test1_import.log FROMUSER=test1 TOUSER=test2 COMMIT=y IGNORE=y
Con esto hemos realizado el import de nuestro archivo .dmp generado anteriormente y hemos especificado ademas que el import se realiza desde el usuario test1 al usuario test2.
Ahora ya estas listo para usar tu nuevo esquema test2 que contiene todos los objetos del esquema test1.