Con MVC, hay una forma directa y sencilla de programar la descarga de un archivo:
La acción del controller debe devolver un tipo FileResult (en lugar del genérico ActionResult)
El return de la acción debe utilizar el método File (símil a View o Json), el cual presenta distintas sobrecargas para especificar:
Contenido (puede ser ruta del archivo en el servidor, bytes del contenido, o un stream)
Nombre de archivo (el nombre que sugerirá el browser al descargarlo)
Tipo de archivo (corresponde al MimeType)
Artículo básico de referencia: http://www.dotnetcurry.com/ShowArticle.aspx?ID=807
Explicación adicional (escenarios de aplicación, invocación, evaluación, etc):
Primeramente, algunos casos de aplicación serían Kayros (para descargar los adjuntos a las solicitudes), Themis (que muchas entidades tienen adjuntos asociados), o ProdTec (que descarga los PDF generados por el servicio WCF).
Segundo, del lado de la vista, lo más natural sería invocar la acción del controller (con los parámetros que la lógica propia de la aplicación requiera) a través de un link, ya que esto es lo más común para una descarga de archivos. En definitiva, lo que debe hacer la vista es nada más que invocar la acción del controller.
Con respecto a links directos a archivos, primeramente, a veces esto no es aplicable, sobre todo en aquellos escenarios en que el archivo a descargar no existe como tal en disco y se genera dinámicamente en el momento de la descarga (como sucede con Omega, si mal no recuerdo). Además, desde el punto de vista de seguridad, no es recomendable el uso de links directos a archivos alojados en el servidor web, y por ello se recurre a esquemas como el utilizado en ProdTec.
Finalmente, en lo que hace a otras alternativas, la verdad es que no estuve investigando otras propuestas. Al menos en principio. ésta que pasé esta mañana me pareció bastante adecuada para escenarios de descarga en general. Obviamente que si aparece una mejor práctica, o algún caso en especial requiere un replanteo, se irá resolviendo conforme aparezcan.