Crear nuevo usuario de sql server

En el servidor de base de datos, en la carpeta Security / Logins, agregar el usuario:




En User Mapping, marcar la base de datos a la que se quiera acceder, y marcar db_datareader:


Agregar el usuario:


En Membership, darle el rol db_datareader


Input type file - subir archivos MVC

*** es importante poner el multipart/form-data !!!!! ***
*** el method tiene que ser Post ***

Vista

@using (Html.BeginForm("GuardarPlanilla""Avales"FormMethod.Post, new { id = "FormGestionPlanilla", enctype = "multipart/form-data" }))

{

      @Html.TextBoxFor(m => m.RutaPlanilla, new { type = "file", Class = "btn btn-success navbar-btn" })

}


Controller

[HttpPost]
public ActionResult GuardarPlanilla(AvalPlanillaVM modelo, AvalPlanillaDetalleVM modeloDet)
{
    var archivo = this.HttpContext.Request.Files.Get("RutaPlanilla");
    var file = (System.Web.HttpPostedFileWrapper)(archivo);
    var nombreArchivo = file.FileName.Substring(file.FileName.LastIndexOf("\\") + 1);
    var rutaArchivo = this.Server.MapPath("../XLS/" + nombreArchivo);

    file.SaveAs(rutaArchivo); 
}

Leer excel con OpenXml y retornarlo en una lista genérica

Uso:

var excel = ExcelLogica.Leer("c:\\temp\\excel1.xlsx");

foreach (var fila in excel)
{
var f = (string[])fila;

          //en el caso de que sea una fecha, hay que parsearla
      fecha = DateTime.FromOADate(int.Parse(f[2]));

Console.WriteLine(f[0] + "  " + f[1] + " " + fecha);
}

Código de ExcelLogica: http://desaX.blogspot.com.uy/2017/12/clase-excellogica.html

Invalidar ModelState manualmente

El primer campo es el key, es el nombre del atributo para el cual se desplegara el mensaje

ModelState.AddModelError("Usuario", "mensaje");



Acceder a otros campos dentro de un CustomAttribute

Ej, para acceder al valor del atributo FechaHasta:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        var otherValue = validationContext.ObjectType.GetProperty("FechaHasta").GetValue(validationContext.ObjectInstance, null);

Refused to display 'site' in a frame because it set 'X-Frame-Options' to 'sameorigin'


En global.asax, agregar:

AntiForgeryConfig.SuppressXFrameOptionsHeader = true;

En web.config:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="AllowAll" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

Validaciones con DataAnnotations

1. Definir los DataAnnotations en el ViewModel para cada atributo que se quiera validar:

[Required(ErrorMessage = "Ingrese el nombre")]
public string Nombre { get; set; }

2. Agregar la verificación en el Action:

public ActionResult Guardar(PersonaViewModel persona)
{
   if (ModelState.IsValid)
   {
      ...
      return View();
   } else
   {
      ViewBag.Mensaje = "Error en los datos ingresados, debe completar los campos requeridos";
      return View("Error");
   }
}

*** El objeto ModelState contiene toda la información de los errores ocurridos, en ModelState.Values
*** Solo con esto, ya queda funcionando la validación del lado del servidor.
*** Para que la validación se haga también del lado del cliente, se debe agregar lo siguiente:

1. Agregar los siguientes scripts:

<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>

2. Agregar los ValidationMessages para cada atributo:

<div class="field-validation-error">@Html.ValidationMessageFor(m => m[i].Path)</div>
@Html.TextBoxFor(m => m[i].Path)

3. También se puede agregar el ValidationSummary, que sirve para mostrar un resumen de todos los campos con error. Esto en general se agrega al final de la página:

<div class="validation-summary-errors">
    @Html.ValidationSummary()
</div>

*** Tener en cuenta que el comportamiento de las validaciones en IE a veces es diferente a Chrome ***

Generar excel con OpenXML y retornarlo en el Response

public ActionResult DesplegarExcel(SubdiarioViewModel subdiario)
{
            //lista es una estructura generica (ej, un DTO), con cualquier complejidad

            var ret = ExcelLogica.GenerarOpenXml(lista, "A1:AB1");

            Response.Clear();
            Response.ContentType = "application/force-download";
            Response.AddHeader("content-disposition", "attachment; filename=" + nombre);
            Response.BinaryWrite(ret);         
            Response.Flush();
            Response.End();

            return new EmptyResult();