Simplemente cree una interfaz para devolver en lugar de una clase.
public interface IMyViewModel {
string MyPublicProperty { get; set; }
}
A continuación, cree una clase que hereda la interfaz
public class MyViewModel : IMyViewModel {
public string MyPublicProperty { get; set; }
public string MyNotSoPublicProperty { get; set; }
}
y devolver la interfaz, no a la clase, en el controlador de Acción
public JsonResult MyJson(){
IMyViewModel model = new MyViewModel();
return Json(model);
}
Y el JSON resultante será
{
'MyPublicProperty': ''
}
Uno de los desafíos en las secuencias de comandos del lado del cliente es que, si está cambiando las clases, no tiene idea de si está destruyendo la implementación del lado del cliente o no. Si utiliza tipos de interfaz en su JSON, comprenderá que si cambia la interfaz, está haciendo algo que posiblemente mate la implementación del lado del cliente. Y también le evita duplicar la verificación del lado del cliente en vano si está cambiando algo que NO está en la interfaz (por lo que no se serializa).
También, muchas veces, sus ViewModels pueden tener grandes colecciones o tipos complejos en ellos que no necesariamente desea entregar al cliente. Puede llevar mucho tiempo serializar o exponer información que simplemente no pertenece al código del cliente. El uso de interfaces hará que sea más transparente saber qué es lo que está en la salida.
Además, el uso de atributos como [ScriptIgnore] en una propiedad solo se aplica a un escenario específico (Serialización de JavaScript), lo que le obliga a enfrentar exactamente el mismo problema si posteriormente lo serializa a XML, por ejemplo. Esto innecesariamente ensuciaría tus modelos de vista con toneladas de atributos. ¿Cuántos de ellos realmente quieres allí? El uso de intefaces se aplica en cualquier lugar y ningún modelo de vista debe estar repleto de atributos adicionales.
La mayor parte de la respuesta está usando Attribute o wraper cualquiera. Simplemente quiero excluir algunas de las propiedades públicas durante la serialización. Estoy buscando JSON.NET como lo sugiere @Charlino pero no encontré el camino. Este es el caso: tengo la propiedad 'Error' que solo se configurará cuando se produzca un error. el lado del cliente comprobará que este primero muestre el mensaje; de lo contrario, mostrará el resto de la propiedad del modelo. Cuando no hay ningún error, se mostrará '{...," Error ": null}'! – CallMeLaNN