Traer de vuelta ventana de aplicación.

Probado en Windows 8.1
¿Cómo traer de vuelta al escritorio una ventana de aplicación que se encuentra mostrándose por error fuera de la pantalla en un monitor secundario (que no tienes conectado)?

Si alguna vez han conectado una laptop a un monitor secundario y luego lo desconectaron sin antes recordar traer de vuelta las aplicaciones que se mostraban en ese monitor al escritorio principal, probablemente han visto este problema.

La aplicación está corriendo la podemos ver en la barra de tareas pero no podemos verla en la pantalla porque la aplicación piensa que está corriendo en el monitor secundario.

Sigan este procedimiento. En Windows 8.1 si le dan clic derecho en la barra de tareas a la aplicación que no podemos ver nos muestra un menú que no tiene el commando «Mover». Sin embargo podemos usar la combinación de tecla «ALT» y luego «Flecha Abajo», se mostrará un menú donde el segundo elemento es «Mover», el cursor cambiará a una cruz pero todavía no podrás mover nada. Presiona una tecla de las flechas (cualquiera) y mueve el ratón y la ventana automágicamente se verá en la pantalla.

Nota: Para gente que le gusta usar el teclado prueben esto. Alt+Tab hasta llegar a la ventana de la aplicación en cuestión y luego Alt+Espaciador luego «M» luego tecla de flechas y luego mueve el ratón.

Opcionalmente puedes darle clic derecho en la barra de tareas y escoger «Cascada» y a menudo traerá la ventana de la aplicación que quieres de regreso a la pantalla principal.

ASP.NET MVC Entrevista: Preguntas y Respuestas.

Para leer el artículo original en inglés de Shivprasad koirala. http://www.codeproject.com/Articles/556995/MVC-Interview-questions-with-answers

Descargo de Responsabilidad (Disclaimer)

Leyendo esto no significa que podrás pasar entrevistas sobre MVC. El propósito de este artículo es pulir rápidamente tu conocimiento de MVC (Model View Controller) antes de una entrevista sobre MVC.

Este artículo no enseña MVC, es una hoja de revisión de último minuto antes de ir a una entrevista sobre MVC.

En caso que quieran aprender MVC de cero empiecen leyendo: http://www.codeproject.com/Articles/207797/Learn-MVC-Model-View-Controller-step-by-step-in-7 O pueden empezar con: https://www.youtube.com/playlist?list=PL33C9E91F8CDD2BF7

¿Qué es MVC (Model-View-Controller) Modelo-Vista-Controlador?

MVC es un patrón de arquitectura el cual separa la representación y la interacción del usuario. Está divido en 3 secciones. «Modelo», «Vista», «Controlador».

  • La «Vista» es responsible por la apariencia «look and feel».
  • El «Modelo» representa un objeto del mundo real y provee de data para la «vista».
  • El «Controller» es responsable de tomar la petición del usuario y cargar el «modelo»  y la «vista» apropiados.

mvc

¿Puedes explicar el flujo completo de MVC?

A continuación los pasos de como el control fluye en la arquitectura MVC (Modelo, Vista y Controlador).

  • Toda petición (request) del usuario final es primero enviada al controlador.
  • El controlador dependiendo de la petición decide cual modelo cargar. El controlador carga el modelo y enlaza el modelo con la vista apropiada.
  • La vista final es luego enlazada con la data del modelo y enviada como una respuesta al usuario final en el navegador (browser).

¿Es MVC apropiado para aplicaciones web y windows ambas?

La arquitectura de MVC es más apropiada para aplicaciones web que windows. Para aplicaciones windows MVP por ejemplo «Modelo-Vista-Presentador» es más aplicable. Si estás usando WPF (Windows Presentation Foundation) o SilverLight MVVM (Modelo-Vista-ModeloVista) es más apropiado debido a los enlaces de datos (bindings)

¿Cuáles son los beneficios de usar MVC?

Hay dos grandes beneficios de MVC:

Separación de problemas (concerns) esto se logra ya que se mueve el código detrás (code behind) a un archivo de clase separado. Ya que se mueve el código de enlace (binding) a un archivo de clase separado podemos reutilizar el código en gran parte.

Testeo Automatizado de la UI (interfaz de usuario), es posible porque ahora el código detrás (code behind) el código de interacción de la UI ha sido movido a una simple clase .NET. Esto nos da la oportunidad de escribir pruebas unitarias y automatizar las pruebas manuales.

¿Es MVC diferente de la arquitectura de 3 capas?

MVC es una evolución de la arquitectura tradicional de 3 capas. Muchos componentes de la arquitectura de 3 capas son parte de MVC.

Functionalidad 3 capas MVC
Apariencia Interfaz de usuario. Vista
UI lógica Interfaz de usuario. Controlador
Lógica del negocio /validaciones Capa Intermedia Modelo
La petición se envía primero a User interface Controlador
Accediendo datos Capa de acceso a datos Capa de acceso a datos

mvc3capas

¿Cuál es la última versión de MVC?

Hasta la fecha hay 5 versiones de MVC. MVC 1, MVC 2, MVC 3, MVC 4 y MVC 5. El último es MVC 5.

¿Cuál es la diferencia entre cada versión de MVC?

En una entrevista es difícil hablar de todas ellas debido a la limitación de tiempo. He resaltado las principales diferencias.

MVC 2

Asistentes con plantilla (Templated Helpers) Areas Controladores Asíncronos

MVC 3

Razor Soporte para HTML5 en las plantillas de proyectos

MVC 4

ASP.NET Web API Nuevas características para soportar aplicaciones móviles

MVC 5

ASP.NET Identity Bootstrap en la plantilla MVC Filtros de autenticación Omisión de filtros (filter override)

¿Qué es ruteo en MVC?

El ruteo ayuda a definir una estructura de URL y mapear la URL con el controlador.

Por ejemplo digamos que queremos que cuando un usuario tipee «http://localhost/view/ViewCustomer/», vaya al controlador «customer» e invoque la acción «DisplayCustomer». Esto es definido agregando una entrada en la colección «routes» usando la función «maproute». Ejemplo:

routes.MapRoute(
               "View", // Route name
               "View/ViewCustomer/{id}", // URL with parameters
               new { controller = "Customer", action = "DisplayCustomer",
id = UrlParameter.Optional }); // Parameter defaults

¿Dónde se tiene que escribir el código de mapeo de rutas?

En el archivo «global.asax».

¿Se puede mapear múltiples URLs a la misma acción?

Sí. Sólo necesitas hacer dos entradas con diferentes nombres clave y especificar el mismo controlador y acción.

¿Cómo podemos navegar de una vista a otra vista usando un hiperenlace?

Utilizando el método «ActionLink» como se muestra en el siguiente código. Ese código crea una simple URL la cual navegará al controlador «Home» e invocará la acción «Gotohome».

<%= Html.ActionLink("Home","Gotohome") %>

¿Cómo puedes restringir las acciones MVC para que sean invocadas solamente por un GET o POST?

Puedes decorar la acción MVC con un atributo «HttpGet» o «HttpPost» para restringir el tipo de llamada HTTP. Por ejemplo puedes ver en el siguiente código la acción «DisplayCustomer» puede ser solamente invocado por «HttpGet». Si tratamos de hacer un HTTP post en «DisplayCustomer» arrojará un error.

[HttpGet]
public ViewResult DisplayCustomer(int id)
{
   Customer objCustomer = Customers[id];
   return View("DisplayCustomer",objCustomer);
}

¿Cómo podemos mantener la sesión en MVC?

Las sesiones pueden ser mantenidas en MVC de 3 maneras: tempdata, viewdata y viewbag.

¿Cuál es la diferencia entre tempdata, viewdata y viewbag?

sesionvariables

tempdata: Ayuda a mantener data cuando te mueves de un controlador a otro controlador o desde una acción a otra acción. En otras palabras cuando redireccionas, «tempdata» ayuda a mantener data entre esas redirecciones. Internamente utiliza variables de sesión.
View data: Ayuda a mantener data cuando te mueves de un controlador a una vista.
View bag: Es una envoltura dinámica alrededor de la data de la vista. Cuando utilizas «ViewBag» no es necesario hacer una conversión de tipo. Utiliza la palabra reservada «dynamic» internamente.

dynamickeyword

Variables de Sesión: Utilizando variables de sesión podemos mantener data de cualquier entidad a cualquier entidad.

Campos ocultos en controles HTML (hidden fields): Ayuda a mantener data de la UI hacia el controlador solamente. Se puede enviar data desde controles HTML o campos ocultos hacia el controlador usando métodos HTTP POST o GET.

Abajo hay una tabla que muestra la diferencia entre estos mecanismos de persistencia.

Maintains data between ViewData/ViewBag TempData Hidden fields Session
Controller to Controller No Yes No Yes
Controller to View Yes No No Yes
View to Controller No No Yes Yes

¿Qué son vistas parciales en MVC?

Vistas parciales es una vista reusable (como un control de usuario) las cuales pueden ser puestas dentro de otras vistas. Por ejemplo digamos que todas las páginas de tu sitio tiene una estructura estándar con un menú a la izquierda, cabecera y pie de página como se muestra en la siguiente imagen.

vistasparciales

Para cada página tu necesitarías reutilizar el menú izquierdo, la cabecera y el pie de página. Puedes crear vistas parciales para cada uno de esos items y luego llamar a la vista parcial en la vista principal.

¿Cómo crear vistas parciales?

Cuando agregas una vista a tu proyecto necesitas marcar el check «Create Partial View».

Una vez creada la vista parcial puedes llamarla desde la vista principal utilizando el método «Html.RenderPartial» así:

<body>
<div>
<% Html.RenderPartial("MyView"); %>
</div>
</body>

¿Cómo podemos hacer validaciones en MVC?

Una de las maneras más fáciles de hacer validación en MVC es usar «data annotations». Data Annotations son atributos los cuales son aplicados en las propiedades del modelo. Por ejemplo en el siguiente código tenemos una simple clase cliente «customer» con una propiedad «customercode».

Esta propiedad «customercode» está etiquetada con un atributo de data annotation «Required» (requerido). En otras palabras si este modelo no recibe un «customercode» no será válido.

public class Customer
{
   [Required(ErrorMessage="Customer code is required")]
   public string CustomerCode { get; set; }
}

Para poder mostrar un error de validación necesitamos usar un método «ValidateMessageFor» el cual pertenece a la clase de apoyo «Html».

<% using (Html.BeginForm("PostCustomer", "Home", FormMethod.Post))
{ %>
<%=Html.TextBoxFor(m => m.CustomerCode)%>
<%=Html.ValidationMessageFor(m => m.CustomerCode)%>
<input type="submit" value="Submit customer data" />
<%}%>

Posteriormente en el controlador podemos chequear si el modelo está correcto o no utilizado la propiedad «ModelState.IsValid» y de acuerdo a eso tomar acciones.

public ActionResult PostCustomer(Customer obj)
{
   if (ModelState.IsValid)
   {
      obj.Save();
      return View("Thanks");
   }
   else
   {
      return View("Customer");
   }
}

Abajo se muestra un simple mensaje de error:

validation

¿Podemos mostrar todos los errores en una sola pasada?

Sí podemos, utilizando el método «ValidationSummary» de la clase HTML helper.

<%= Html.ValidationSummary() %>

¿Cuáles son los otros atributos para validación con Data Annotations en MVC?

Si quieres validar la longitud de una cadena, puedes utilizar «StringLength»

[StringLength(160)]
public string FirstName { get; set; }

En caso que quieras utilizar una expresión regular (regular expression)

[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
public string Email { get; set; }

Si quieres validar un rango de números, utiliza el atributo «Range»

[Range(10,25)]
public int Age { get; set; }

En algún momento querrás comparar el valor de un campo con el de otro campo, puede usar el atributo «Compare»

public string Password { get; set; }
[Compare("Password")]
public string ConfirmPass { get; set; }

En caso que quieras obtener un mensaje de error particular, puedes usar la colección «Errors».

var ErrMessage = ModelState["Email"].Errors[0].ErrorMessage;

Si has creado el objeto modelo tú mismo, puedes explícitamente llamar «TryUpdateModel» en tu controlador para chequear si el objeto es válido o no.

TryUpdateModel(NewCustomer);

En caso que quieras agregar errores en el controlador puedes utilizar la función «AddModelError».

ModelState.AddModelError("FirstName", "This is my server-side error");

¿Cómo podemos habilitar validación de Data Annotations en el lado del cliente?

Es un proceso de 2 pasos, primero referencia los necesarios archivos jQuery.

<script src="<%= Url.Content("~/Scripts/jquery-1.5.1.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.validate.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.validate.unobtrusive.js") %>" type="text/javascript"></script>

El segundo paso es llamar al método «EnableClientValidation»

<% Html.EnableClientValidation(); %>

¿Qué es Razor en MVC?

Es una máquina de vistas de peso ligero. Anteriormente sólo se podía utilizar un tipo de máquina de vistas ASPX. Razor fue introducido en MVC 3.

¿Por qué Razor cuando ya teníamos ASPX?

Razor es limpio, liviano y su sintáxis es fácil comparado con ASPX. Por ejemplo en ASPX para mostrar la hora teníamos que escribir:

<%=DateTime.Now%>

In Razor:

@DateTime.Now

¿Entonces cuál es mejor Razor o ASPX?

Según Microsoft Razor es el método preferido porque es liviano y tiene una sintáxis simple.

¿Cómo puedes hacer autenticación y autorización en MVC?

Puedes utilizar autenticación Windows o autenticación de formularios.

¿Como puedes implementar autenticación de Windows en MVC?

Para autenticación de windows necesitas modificar el archivo «web.config» y establecer el mode de autenticación a windows.

<authentication mode="Windows"/>
<authorization>
<deny users="?"/>
</authorization>

Luego en el controlador o en la acción puede utilizar el atributo «Authorize» el cual especifica cuáles usuarios tiene acceso a estos controladores y acciones. Abajo se muestra el código. Ahora solamente usuarios especificados enel controlador y la acción pueden acceder.

[Authorize(Users= @"WIN-3LI600MWLQN\Administrator")]
    public class StartController : Controller
    {
        //
        // GET: /Start/
        [Authorize(Users = @"WIN-3LI600MWLQN\Administrator")]
        public ActionResult Index()
        {
            return View("MyView");
        }
    }

¿Cómo implementas autenticación por formularios en MVC?

Autenticación por formularios es implementado en la misma forma en la que se hace en ASP.NET. El primer paso es establecer el modo de autenticación a formularios. El «loginurl» apunta al controlador en vez de a la página.

<authentication mode="Forms">
<forms loginUrl="~/Home/Login"  timeout="2880"/>
</authentication>

Necesitamos crear un controlador donde revisaremos si el usuario es válido o no. Si el usuario es válido estableceremos un valor en una galletita (cookie).

public ActionResult Login()
{
  if ((Request.Form["txtUserName"] == "Shiv") && (Request.Form["txtPassword"] == "Shiv@123"))
  {
     FormsAuthentication.SetAuthCookie("Shiv",true);
     return View("About");
  }
  else
  {
     return View("Index");
  }
}

Todas las otras acciones necesitan tener el atributo «Authorize» para que cualquier usuario no autorizado que haga una llamada a estos controladores sea redireccionado al controlador (en este caso el controlador es «login») el cual hará la autenticación.

[Authorize]
PublicActionResult Default()
{
  return View();
}
[Authorize]
publicActionResult About()
{
  return View();
}

¿Cómo implementar Ajax en MVC?

Puedes implementar Ajax de dos maneras en MVC:

  • Bibliotecas Ajax (libraries)
  •  jQuery

Abajo hay un simple ejemplo de como implementar Ajax utilizando la biblioteca «Ajax» helper. En el código de abajo puedes ver que tenemos un simple formulario el cual es creado utilizando la sintáxis «Ajax.BeginForm». Este formulario llama a una acción en un controlador llamada «getCustomer». Ahora la accion enviar «submit» ejecutará una llamada Ajax asíncrona.

<script language="javascript">
function OnSuccess(data1)
{
// Do something here
}
</script>
<div>
<%
        var AjaxOpt = new AjaxOptions{OnSuccess="OnSuccess"};
    %>
<% using (Ajax.BeginForm("getCustomer","MyAjax",AjaxOpt)) { %>
<input id="txtCustomerCode" type="text" /><br />
<input id="txtCustomerName" type="text" /><br />
<input id="Submit2" type="submit" value="submit"/></div>
<%} %>

En caso quieras hacer llamadas Ajax en clics sobre hiperenlaces puedes utilizar la función «Ajax.ActionLink» como se muestra en el siguiente código.

ajax

 Si quieres crear un enlace Ajax asíncrono de nombre «GetDate» el cual llama la función «GetDate» en el controlador, el código se encuentra debajo. Una vez que el controlador responda esta data es mostrada en la etiqueta html «Div» que tiene el nombre «DateDiv».

<span id="DateDiv" />
<%:
Ajax.ActionLink("Get Date","GetDate",
new AjaxOptions {UpdateTargetId = "DateDiv" })
%>

A continuación el código que va en el controlador. Como puedes ver la funcion «GetDate» tiene una pausa de 10 segundos.

public class Default1Controller : Controller
{
       public string GetDate()
       {
           Thread.Sleep(10000);
           return DateTime.Now.ToString();
       }
}

La segunda manera de hacer llamadas Ajax en MVC es utilizando jQuery. En el ejemplo que sigue podemos ver que estamos haciendo una llamada POST a una URL «/MyAjax/getCustomer». Esto es hecho usando «$.post». Toda esta lógica se encuentra en una función llamada «GetData» y puedes hacer una llamada a la función «GetData» en un botón o un evento clic en un hiperenlace como quieras.

function GetData()
    {
        var url = "/MyAjax/getCustomer";
        $.post(url, function (data)
        {
            $("#txtCustomerCode").val(data.CustomerCode);
            $("#txtCustomerName").val(data.CustomerName);
        }
        )
    }

¿Qué clase de eventos pueden ser registrados en Ajax?

ajaxevents

¿Cuál es la diferencia entre «ActionResult» y «ViewResult»?

«ActionResult» es una clase abstracta mientras que «ViewResult» deriva de la clase «ActionResult». «ActionResult» tiene muchas clases derivadas como «ViewResult», «JsonResult», «FileStreamResult», etc.

«ActionResult» puede ser utilizada explotando polimorfismo y dinamismo. Si estas devolviendo diferentes tipos de vistas dinamicamente «ActionResult» es lo mejor. Por ejemplo en el código que sigue puedes ver que tenemos una simple acción llamada «DynamicView». Dependiendo de la bandera «IsHtmlView» devolverá un «ViewResult» o un «JsonResult».

public ActionResult DynamicView()
{
   if (IsHtmlView)
     return View(); // returns simple ViewResult
   else
     return Json(); // returns JsonResult view
}

¿Cuáles son los diferentes tipos de resultados en MVC?

Nota: Es difícil recordar todos los tipos. Los más importantes son «ActionResult», «ViewResult» y «JsonResult»

En la cima se encuentra «ActionResult» es cual es la clase base que puede tener 11 subtipos:

ViewResult – Muestra la vista especificada a la corriente (stream response) de respuesta
PartialViewResult – Muestra la especificada vista parcial a la corriente de respuesta.
EmptyResult – Una respuesta vacía es devuelta.
RedirectResult – Ejecuta una redirección HTTP a la URL especificada.
RedirectToRouteResult – Ejecuta una redirección HTTP a la URL que está determinada por la máquina de ruteo, basado en la data de ruteo dada.
JsonResult – Serializa un objeto ViewData en el formato Json
JavaScriptResult – Devuelve una pieza de código JavaScript que puede ser ejecutado en el cliente.
ContentResult – Escribe contenido a la corriente de respuesta sin requerir de una vista.
FileContentResult – Devuelve un archivo al cliente.
FileStreamResult – Devuelve una archivo al cliente, el cual es provisto por una corriente (stream)
FilePathResult – Devuelve un archivo al cliente

¿Que son «ActionFilters» en MVC?

«ActionFilters» ayudan a ejecutar lógica mientras una acción MVC está ejecutándose o después que una acción MVC se ha ejecutado.

actionfilters

Los filtros de acción son útiles en los siguientes escenarios:

  1. Implementar lógica antes que la acción suceda.
  2. Cancelar una ejecución actual.
  3. Inspeccionar el valor retornado.
  4. Proveer datos extra a la acción

Puedes crear filtros de acción de 2 maneras:

  • En línea Inline Action Filter.
  • Creando un atributo «ActionFilter».

Para crear un inline action filter necesitamos implementar la interfaz «IActionFilter». La interfaz «IActionFilter» tiene 2 métodos «OnActionExecuted» y «OnActionExecuting». Podemos implementar lógica de pre-procesamiento o lógica de cancelación en estos métodos.

public class Default1Controller : Controller , IActionFilter
    {
        public ActionResult Index(Customer obj)
        {
            return View(obj);
        }
        void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
        {
            Trace.WriteLine("Action Executed");
        }
        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {
            Trace.WriteLine("Action is executing");
        }
    }

El problema con un atributo «inline action» es que no puede ser reutilizado con otros controladores. Podemos convertir el inline action filter en una atributo. Para crear un atributo action filter necesitamos heredar de «ActionFilterAttribute» e implementar la interfaz «IActionFilter» como se muestra en el siguiente código:

public class MyActionAttribute : ActionFilterAttribute , IActionFilter
{
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
     Trace.WriteLine("Action Executed");
}
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
      Trace.WriteLine("Action executing");
}
}

Posteriormente podemos decorar los controladores en los cuales queremos el action filter que se ejecute. Podemos ver en el siguiente código que he decorado el «Default1Controller con la clase «MyActionAttribute» la cual fue creada en el código previo.

[MyActionAttribute]
public class Default1Controller : Controller
{
 public ActionResult Index(Customer obj)
 {
 return View(obj);
 }
}

¿Podemos crear una máquina de vistas personalizada utilizando MVC?

Sí, podemos crear nuestra propia máquina de vistas en MVC. Para crear nuestra propia máquina de vistas necesitamos seguir 3 pasos.
Digamos que queremos crear una máquina de vistas personalizada donde el usuario pueda tipear un comando como «» y muestre la fecha y hora actual.
Paso 1. Necesitamos crear una clase que implemente la interfaz «IView». En esta clase debemos escribir la lógica de como la vista será mostrada en la función «Render».

public class MyCustomView : IView
    {
        private string _FolderPath; // Define where  our views are stored
        public string FolderPath
        {
            get { return _FolderPath; }
            set { _FolderPath = value; }
        }

        public void Render(ViewContext viewContext, System.IO.TextWriter writer)
        {
           // Parsing logic <dateTime>
            // read the view file
            string strFileData = File.ReadAllText(_FolderPath);
            // we need to and replace <datetime> datetime.now value
            string strFinal = strFileData.Replace("<DateTime>", DateTime.Now.ToString());
            // this replaced data has to sent for display
            writer.Write(strFinal);
        }
    }

Paso 2. Necesitamos crear una clase que herede de «VirtualPathProviderViewEngine» y en esta clase necesitamos proveer la ruta a la carpeta y la extension de la vista. Por ejemplo la extensión de Razor es «cshtml», para ASPX la extension es «.aspx», de la misma manera nuestra vista personalizada necesita que le demos una extensión. En el siguiente código establecemos «ViewLocationFormats» a la carpeta «Views» y la extensión «.myview».

public class MyViewEngineProvider : VirtualPathProviderViewEngine
    {
        // We will create the object of Mycustome view
        public MyViewEngineProvider() // constructor
        {
            // Define the location of the View file
            this.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.myview", "~/Views/Shared/{0}.myview" }; //location and extension of our views
        }
        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            var physicalpath = controllerContext.HttpContext.Server.MapPath(viewPath);
            MyCustomView obj = new MyCustomView(); // Custom view engine class
            obj.FolderPath = physicalpath; // set the path where the views will be stored
            return obj; // returned this view paresing logic so that it can be registered in the view engine collection
        }
        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            var physicalpath = controllerContext.HttpContext.Server.MapPath(partialPath);
            MyCustomView obj = new MyCustomView(); // Custom view engine class
            obj.FolderPath = physicalpath; // set the path where the views will be stored
            return obj; // returned this view paresing logic so that it can be registered in the view engine collection
        }
    }

Paso 3. Necesitamos registrar la vista en la colección de vistas personalizadas. El mejor lugar para registrar esta máquina de vistas personalizada es en la colección «ViewEngines» en el archivo «global.asax».

protected void Application_Start()
 {
            // Step3 :-  register this object in the view engine collection
            ViewEngines.Engines.Add(new MyViewEngineProvider());
<span class="Apple-tab-span" style="white-space: pre; ">	</span>…..
}

Abajo está una simple muestra de la vista personalizada

customview

¿Cómo enviar resultados en el formato Json en MVC?

En MVC tenemos la clase «JsonResult» la cual puede retornar data en el formato Json. Debajo hay un simple ejemplo el cual devuelve el objeto «customer» en el formato Json utilizando «JsonResult»

public JsonResult getCustomer()
{
Customer obj = new Customer();
obj.CustomerCode = "1001";
obj.CustomerName = "Shiv";
 return Json(obj,JsonRequestBehavior.AllowGet);
}

Debajo se muestra el resultado del código anterior si invocas la acción via el navegador de internet.

json

¿Qué es el «WebAPI»?

HTTP es el protocolo más utilizado. Por muchos años el navegador de internet ha sido el cliente preferido por el cual podemos consumir data expuesta sobre HTTP. Pero como los años pasan y la variedad de clientes navegadores de internet ha crecido. Tenemos una demanda para consumir data en HTTP de clientes como móviles, javascripts, aplicaciones windows, etc.

Para satisfacer el rango amplio de clientes, «REST» fue la solución propuesta.

«WebAPI» es la tecnología por la cual podemos exponer data sobre HTTP siguiendo los principios de REST.

¿Pero WCF SOAP también hace la misma cosa, en qué difiere «WebAPI»?

SOAP: Es peso pesado por la complicada estructura WSDL, es independiente de los protocolos, para leer un mensaje SOAP el cliente necesita entender el formato WSDL. Escribir un código para leer un WSDL personalizado es una tarea pesada. Si el cliente es suficientemente inteligente para crear objetos proxy como se puede en .NET, entonces SOAP es más facil de consumir y llamar. SOAP sigue la especificación WS-*.

WebAPI: Peso ligero, solo la información necesaria es transmitida, sólo utiliza protocolo HTTP, la salida de WebAPI es una simple cadena: Json o XML. Escribir código es muy facil. Web API sigue los principios de REST.

¿Con WCF también puedes implementar REST, por qué utilizar «WebAPI»?

WCF se trajo para implementar SOA, la intención nunca fue implementar REST. «WebAPI» se construyó de cero y su única meta es crear servicios HTTP utilizando REST. Debido a que su único enfoque es crear servicios «REST» hace que WebAPI sea preferido.

¿Cómo implementar WebAPI en MVC?

Paso 1. Crea un proyecto utilizando la plantilla WebAPI.

webapiplantilla

Paso 2. Una vez que hayas creado el proyecto notarás que el controlador ahora hereda de «ApiController» y puedes implementar los métodos de protocolo HTTP «post», «get», «put» y «delete».

public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
        // POST api/values
        public void Post([FromBody]string value)
        {
        }
        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }
        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }

Paso 3. Si haces una llamada HTTP GET deberías obtener los siguientes resultados.

xmlresult

¿Cómo puedo detectar que un controlador MVC es llamado por POST o GET?

Para detectar si la llamada en el controlador es una acción POST o GET podemos utilizar la propiedad «Request.HttpMethod» como se muestra a continuación.

public ActionResult SomeAction()
{
            if (Request.HttpMethod == "POST")
            {
                return View("SomePage");
            }
            else
            {
                return View("SomeOtherPage");
            }

}

Windows 8.1 ya está aquí.

De Engadget: http://www.engadget.com/2013/10/17/windows-8-1-now-available-to-download/

Windows 8.1 ya puede descargarse desde hoy 17 de Octubre de 2013 7:00AM ET (tiempo del este 6:00AM para Peru) a pesar que la fecha de lanzamiento es mañana 18 de Octubre.

La actualización del Sistema Operativo (OS) está empezando a aparecer en la tienda de Windows (Windows Store) como una descarga gratuita.

¿No tienes un dispositivo con Windows 8? No hay problema puedes actualizar a Windows 8.1 desde Windows 7 solo que tienes que pagar, lo bueno es que cuesta lo mismo que si actualizares desde Windows 8: US$120 para la versión Standard y US$200 para la versión Pro. Microsoft también está vendiendo una version complete que permite instalar el sistema operative en una máquina que no tenga Windows.

También de Engadget: http://www.engadget.com/2013/10/17/facebook-app-windows-8-1/

Por otro lado la aplicación de Facebook llega justo a tiempo para el lanzamiento de Windows 8.1, es una versión practicamente idéntica a la versión web. Tienes que tener Windows 8.1 para poder descargarla.

Según Anandtech:

Windows 8.1 tiene soporte para la tecnología de Intel Connected Standby Technology para Haswell, Direct3D 11.2 y un revisado mecanismo para escalar DPI, está orientado para pantallas con alto DPI que están por llegar al mercado para ultrabooks y escritorio.

El tamaño de la actualización varía dependiendo la plataforma, para Windows 8 Pro es aproximadamente 3.45GB.

Según Ars Technica por Andrew Cunningham:

Windows 8.1 incluye encriptación de disco automática (si tu dispositivo lo soporta)

«Encriptación de dispositivo ayuda a proteger los archivos y carpetas de acceso no autorizado en caso de que tu dispositivo se pierda o sea robado.»

Desde Windows Vista las versions más caras de Windows soportaban encriptacion de disco local a través de una caracteristica llamada BitLocker Drive Encryption. Parecido a FileVault en nuevas versiones de OS X (Apple) o «encrypt device» en algunas tabletas y teléfonos Android. Usualmente necesitas activar BitLocker manualmente para tomar ventaja de él. Una vez activado protege los datos en tu dispositivo en el caso que alguien se lo lleve.

A pesar de todo, algunos dispositivos móviles (incluyendo iOS, Windows Phone 8 y Windows RT) no requieren que los usuarios tengan que activarlo. Estos sistemas operativos pueden asumir que el hardware soporta encriptación y activarla por defecto de una manera que es totalmente invisible para el usuario. Windows 8.1 finalmente brinda esta característica a tabletas x86 y ultrabooks, Microsoft lo llama «device encryption». Mientras que tiene unos requisites muy específicos de hardware, esta característica está diseñada para mejorar la seguridad local para usuarios de Windows sin que ellos tenga que saber sobre eso.

¿Cómo funciona?

La encriptación de dispositivo trata tu tableta x86 o computadora de escritorio como si fuera un dispositivo basado en ARM ya sea una tableta o un teléfono inteligente (smartphone). En vez de requerir que un Administrador lo active, la partición de inicio del dispositivo viene encriptada salida de la caja. Esta encriptacion es esencialemente invisible durante uso normal, levantas la tableta inicias session y la utilizas como lo harías con cualquier PC sin encriptar. Si alguien roba el dispositivo, ellos no podrían acceder la información sin la clave de tu cuenta o tu llave de encriptación, la cual en este caso está protegida por la clave de tu cuenta

Según Ars Technica:

En Windows 8.1 el correo finalmente es utilizable en tabletas y escritorios.

Cuando Windows 8 salió hace un año la aplicación de correo (Mail) era buena para uso casual no para una seria productividad. Ahora soporta multitarea (multitasking), se siente más integrada con otras aplicaciones, han corregido errores y otros cambios menores.

Intel dice que te prepares para tabletas de 99 dólares, laptops con procesador Haswell a 299 dólares e híbridos 2-en-1 a 349 dólares.

Si estás esperando alguna buena oferta para las fiestas navideñas, sigue leyendo, tal parece que Intel tiene buenas noticias para ti.

El Director Ejecutivo (CEO) de Intel Brian Krzanich dice que espera que los fabricantes de equipos originales (OEMs) empujen los precios hacia abajo en las semanas que vienen y que esto resultará en tabletas de US$99, laptops Haswell (última generación de procesadores de Intel) a US$299 e híbridos 2-en-1 a US$349 (son tabletas y notebooks a la vez).

Krzanich durante una conferencia el día de ayer (15 de Octubre de 2013) dijo a los analistas que notebooks táctiles que utilizan los nuevos procesadores Haswell de la compañía estarán en el corazón de la linea de PC de estas navidades.

Intel está fijando muchas esperanzas en Haswell, y la duración de bateria 50% mejor que ofrecen estos chips, combinado con el doble de poder en gráficos, tentará a los compradores a dejar de gastar su dinero en tabletas basadas en Android y iOS (estos 2 sistemas operativos utilizan chips basados en ARM un competidor de Intel) y esto les impulsará a darle a la PC una segunda oportunidad.

Para dispositivos construidos utilizando Bay Trail (parte de la línea de chips Atom), Krzanich cree que habrán entre 8 a 10 modelos tipo almeja (clamshell) disponibles a US$299.

Estos son la clase de niveles de precio que pondrán presión en el mercado de tabletas Android (podría se un mal momento para Amazon y su nueva tableta Kindle Fire HDX), y podría incluso canibalizar a Apple, especialmente en los modelos económicos de la línea iPad. Incluso podría ser malas noticias para Microsoft y sus nuevas tabletas Surface 2.

«Continuamos viendo como la adopción de la tecnología táctil continua avanzando», Krzanich. Esto sin duda son buenas noticias para Microsoft, quien apostó la granja en la adopción del toque cuando hizo Windows 8 una plataforma táctil-primero.

El tercer trimestre de Intel tuvo ganancias mejores de las esperadas, debido a ganancias en servidores y nube.

Para leer el artículo original en inglés de Adrian Kingsley-Hughes: http://www.zdnet.com/intel-says-get-ready-for-99-tablets-299-haswell-notebooks-349-2-in-1-hybrids-7000022020/?s_cid=e539&ttag=e539

No siempre apuntes a cumplir fechas límite irreales.

Las fechas límite son grandiosas para mejorar la productividad. De hecho, ellas solas pueden ser el mejor motivador para lograr que las cosas se hagan. A pesar de todo, si se te da una fecha límite imposible de alcanzar, trabajar hasta quedar exhausto (work your tail off) para lograrla puede ser malo para ti a largo plazo.

Hay siempre circunstancias que harán que se requiera que trabajemos durante el fin de semana o tomar jornadas de 16 horas en ocasiones, es fácil que eso se vuelva la norma y nos desgaste. Como Tom Lauzon Director de Información (CIO) de Health Plan indica:

«Cuando terminas un proyecto con una fecha límite irreal, tu recompensa será otro proyecto con otra fecha límite irreal.»

Si te enfrentas con una fecha límite irreal de tus jefes, asegúrate de hacerles saber tus preocupaciones tan pronto como sea posible y explicarles por qué piensas que no puede hacerse en el periodo de tiempo que ellos quieren. Obviamente, no deberías tratar de sabotear tu propio proyecto para probar que no es posible, pero si expresas las preocupaciones temprano y haces tu mejor esfuerzo, no temas permitir que la fecha límite pase a menos que quieras conseguir otro similar en el futuro cercano.

Lee el original en inglés de Lifehacker by Eric Ravenscraft http://lifehacker.com/dont-always-aim-to-meet-unrealistic-deadlines-1444834485

Como Microsoft inventó casi todo (incluyendo la rueda). Y ¿por qué no siempre le salió bien?

microsoftinvented

De todas las críticas que recibe Microsoft, «no es innovador!» es la que debe doler más. Microsoft tiene la habilidad como la de Forrest Gump de estar presente en cada gran desarrollo tecnológico y en muchos casos se encontró entregando hardware, software y servicios años sino décadas antes que los demás le siguieran el paso.

Tristemente algunas de sus ideas fueron mejores que su ejecución mientras que otras estuvieron simplemente muy adelante de su tiempo. Aquí algunos favoritos:

Google TV

La TV se une con la Web «TV meets Web». Dijo Google en el 2010. La web se une con la TV «Web meets TV» o WebTV como originalmente se le llamaba, fue el primer dispositivo de electrónica para consumidor en accede la Web sin requerir de una computadora – y fue también el primer navegador de internet basado en un TV, lanzado en días anteriores a que estuviera disponible la banda ancha. Microsoft adquirió esta tecnología en 1997, y la tecnología finalmente se convirtió en parte de la Xbox y Xbox360. MSN TV fue retirada este año.

iPads

Es irónico que el iPad esté destruyendo la PC, ya que Microsoft llegó allí 8 años antes que Apple: La Tablet PC, la cual se empezó a vender en el 2002, fue diseñada para combinar poder y portabilidad. La tecnología no estaba a la altura del trabajo que tenía que hacer, eran grandes, voluminosas y caras – el proyecto se entercó en malas decisiones tales como el sabotaje deliberado de Microsoft Office, a cuyo jefe no le gustaba la idea de las tabletas. Microsoft tenía las partes componentes incluyendo las mesas enormes multi-toque Surface (no confundir con las nuevas tabletas), la Tablet PC y el proyecto Origami PCs Ultra-móviles (UMPCs) pero sería Apple quien encontrara la combinación ganadora.

Teléfonos Inteligentes (smartphones)

Es un teléfono, es un PDA, es un reproductor de media, es una herramienta de trabajo para empresas. Está 7 años antes de su tiempo. La plataforma de Microsoft PocketPC – posteriormente renombrada Windows Mobile – destinada a usuarios avanzados móviles tan temprano como el año 2000 y para el año 2007 Windows Mobile 6 estaba apareciendo en hardware muy deseable. Windows Mobile era esencialmente Windows reducido en escala pero los rivales prosperaron con una estrategia completamente diferente: ellos apuntaron a simplicidad y comenzaron de cero en vez de tratar de adaptar sistemas operativos de escritorio existentes. Al parecer su estrategia fue la mejor.

Siri y Google Now

Oh, como nos burlamos: Microsoft Bob ocultaba toda la parte dificil de la PC detrás de una interfaz de caricatura mientras que Clippy trataba de hacernos escribir nuestras cartas. Pero Bob no era muy diferente de Siri y Clippy fue una versión muy temprana de lo que hace Google Now, el primero hacía la computación libre-de-computadora y el segundo trata de anticipar lo que necesitas más adelante y de proveértelo. Como en muchos otros proyectos de Microsoft, las ideas estaban muy adelante de lo que la tecnología existente podía entregar.

Facebook.

¿Un jardín cercado que está diseñado para mantener a la gente fuera del internet abierto tanto como sea possible? Muy 1995: El acceso a internet de Microsoft, posteriormente renonmbrado MSN, fue diseñado como un sistema parecido a America OnLine AOL que se integraría con tu computadora y te mantendría usando un servicio propietario. El error de MSN fue meterse de cabeza por la ruta de proveer contenido en un momento en que todo el mundo tenía que usar enlaces por teléfono (dial-up) y para finales de los 90 MSN decidió competir contra portales como Yahoo!

Relojes Inteligentes (Smart Watches)

Seiko hizo los primeros relojes inteligentes, pero Microsoft hizo los primeros que tomaron ventaja de datos móviles: Los SPOT Smart Personal Object Technology, estos relojes recibían datos a través de FM. Desafortunadamente sufrieron del mismo problema que afecta los más recientes intentos tales como el Galaxy Gear de Samsung, la falta de la obvia aplicación definitiva (killer app).

Smart TVs (TVs inteligentes)

Microsoft ha estado tratando de solucionar la TV desde el cambio de milenio: desde Windows XP Media Center Edition a Windows 8 Pro, ha ofrecido software para media que vuelve la PC en el centro del entretenimiento del hogar, toca videos, accesa media en internet (streaming), muestra tus fotos, graba TV en vivo, envía contenidos inalámbricamente a otros dispositivos… todo innegablemente brillante y cruelmente ignorado por el mercado masivo. Al parecer lo que el mercado estaba esperando era Netflix, y hoy los esfuerzos de Microsoft giran alrededor de acceder servicios de tipo Netflix en PCs, tabletas y Xbox.

Lectores de libros electrónicos (eBook readers)

La TV no era la única clase de media en la que Microsoft pensaba en el 2000: Su Microsoft Reader salió ese año, mucho antes que la gente supiera que eran los libros electrónicos (ebooks). Corría en Windows, en Pocket PCs y en Windows Mobile, pero a pesar de su tecnología ClearType la experiencia de lectura no era ideal, los libros estaban protegidos con DRM (digital rights management) y había muy poco contenido disponible. No fue hasta que Amazon combinara su barata tinta electrónica (eInk) con una inmensa selección, para que los libros electrónicos realmente despegaran y aun eso tomó muchas generaciones.

iOS 7

¿Quién inició plano y minimalista primero? ¿Microsoft con Windows Phone o Apple con iOS 7? Aquí una pista: no fue Apple.

Jugar en consolas en línea (online console gaming)

Aquí hay una inusual cadena de eventos: cuando se trata de consolas de videojuegos, Microsoft no fue el inventor pero el que lo perfeccionó. Sega trató con con consolas de videojuegos en línea primero con la Dreamcast pero era la época de la conexión telefónica (dial-up), Xbox Live fue diseñada para la banda ancha y Microsoft hizo un trabajo fenomenal.

Spotify e iTunes Radio

Costaba 9 libras por mes, ofrecía acceso ilimitado a musica en dispositivos portátiles, PCs y consolas de videojuegos y fue lanzado en el 2008. No, no fue Spotify: eso no existió en Estados Unidos hasta el 2011 y de se seguro iTunes Radio no apareció hasta el 2013. Microsoft le ganó a Spotify (y muchos otros) en un area crucial: tener acuerdos con las grandes disqueras para usar su música: Zune Pass ha sido ahora renombrada Xbox Music.

La rueda

wheel

¡No, no «esa» rueda! Nos referimos a la rueda del ratón. Erich Michelman de Microsoft quería una manera de acelerar la navegación de las hojas de cálculo, brevemente consideró una palanca y luego tuvo la idea de una rueda luego de discutir diferentes opciones con ingenieros de Microsoft Hardware. Michelman quería la rueda para aproximar, no desplazarse, pero finalmente se usó para desplazarse.

Ver original en inglés aquí: http://www.techradar.com/us/news/world-of-tech/how-microsoft-invented-almost-everything-including-the-wheel–1188743

Sine Qua Non

Sine Qua Non or condicio sine qua non, plural: condiciones sine quibus non. Se refiere a una esencial e indispensable condición, acción, o ingrediente. Originalmente era un término legal en latin para «una condición sin la cual no puede ser» o «pero para» o «sin la cual no hay nada».

Ejemplo: De alguna manera, la mayoría de publicadores han sido presionados a creer que Microsoft Word es sine qua non de los sistemas de producción de documentos. Extraído de: http://www.antipope.org/charlie/blog-static/2013/10/why-microsoft-word-must-die.html

Nuevo libro Direct2D

Syncfusion ha publicado un Nuevo libro Direct2D Succintly el autor es Chris Rose. Parte de la serie de libros «Succintly» viene a ser: preciso, breve que va al punto.
direct2dbook

Si alguna vez trataste de trabajar con Direct2D te habrás dado cuenta que la cantidad de código necesaria es abrumadora. Con este libro de Chris Rose, tienes una guía directa paso a paso para generar gráficos con Direct2D. Luego de iniciar con un simple ¡Hola, mundo! en Visual Studio, gradualmente irás progresando hasta un complete sistema de diagramas que contiene multiples páginas, funcionalidad de aproximación «zooming» y soporte para imprimir.

Los capítulos finales del libro están dedicados a Direct3D, el cual no solo genera gráficos en 3D sino que puede generar gráficos en 2D más rápido que usando Direct2D

Descárgalo aquí: http://www.syncfusion.com/resources/techportal/ebooks/direct2d?utm_medium=edm&mkt_tok=3RkMMJWWfF9wsRoluKjLcu%2FhmjTEU5z16u4qW6a%2FhYkz2EFye%2BLIHETpodcMT8BkMbzYDBceEJhqyQJxPr3DKtgNztxrRhHjAQ%3D%3D

¿Cuánto puedes acelerar tus aplicaciones recompilándolas para Windows 8.1?

Todas las aplicaciones creadas para Windows 8 funcionarán perfectamente en la nueva versión Windows 8.1. ¿Obtendrás algo por recompilarla otra vez para este nuevo sistema operativo?

En una interesante sesión en el último evento BUILD, Polita Paulus (Microsoft Principal Product Manager) explicó los beneficios que podemos obtener recompilándola, en aplicaciones basadas en XAML y HTML.

Como cualquier otra actualización del sistema operativo, esta está optimizada para lograr mejor rendimiento y un uso óptimo de la memoria, etc. Y ésto es precisamente lo que se ganará recompilando nuestra aplicación para el nuevo sistema operativo:

  • Entre 5% y 30% de mejora en la velocidad del inicio de la aplicación utilizando ListViews.
  • El desplazamiento en una lista es dos veces más rápido.
  • Entre 10% y 20% menos uso de memoria para aplicaciones XAML.
  • Entre 15% y 35% es más rápida la edición en un ListView en WinJS.

¿Cómo mantienes el código para Windows 8 y para Windows 8.1?

Si quieres mantener una versión de tu aplicación para Windows 8 y otra para Windows 8.1 tienes 2 opciones:

  • Si usas control de código fuente, crea una nueva ramificación e integra las correcciones de los errores. Microsoft usa esta opción.
  • Copia la solución completa y haz las correcciones en ambas soluciones.

Herramientas y Proyectos soportados.

Visual Studio 2013 Professional, Premium y Ultimate.

  • Crear, editar y construir proyectos de Windows 8.1
  • Actualiza proyectos Windows 8 a Windows 8.1
  • Edita y construye proyectos Windows 8

Visual Studio 2013 Express.

  • Crear, editar y construir proyectos de Windows 8.1
  • Actualizar proyectos de Windows 8 a Windows 8.1

Visual Studio 2012 y Visual Studio 2013 pueden ejecutarse lado a lado.

La sesión trata muchos temas: presenta muchas nuevas características para programadores de Windows 8.1 y describe de manera especial los cambios en la vista «Snap View», desde que nuestras aplicaciones ahora puedes ser ordenadas de muchas maneras en la pantalla.

Ver la sesión aquí: http://channel9.msdn.com/Events/Build/2013/3-077

Extraído de campusMVP.net