2011-02-22 16 views
6

Estoy publicando datos en una actin usando el método $ .ajax en jquery, especificando los datos que se publicarán usando el campo de datos para pasar los valores de la cadena JSON.ASP.net MVC 3 - Obteniendo datos JSON en OnActionExecuting

Estos se publican en la acción Aceptar, pero no puedo incluirlos en un filtro de acción OnActionExecuting (no forman parte de las colecciones Forms o Params). ¿Hay alguna manera de obtenerlos? Si no, ¿podría decirme por qué no?

Respuesta

11

Si su acción se lleva a un modelo:

[HttpPost] 
public ActionResult About(SomeViewModel model) 
{ 
    return Json(model); 
} 

se podía directamente el valor del parámetro porque el JsonValueProviderFactory habría analizado ya:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    SomeViewModel model = filterContext.ActionParameters["model"] as SomeViewModel; 
} 

Si no existe un modelo (¿por qué no lo haría ¿Hay?) podría leer el JSON de la secuencia de solicitud:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    filterContext.HttpContext.Request.InputStream.Position = 0; 
    using (var reader = new StreamReader(filterContext.HttpContext.Request.InputStream)) 
    { 
     string json = reader.ReadToEnd(); 
    } 
} 
+1

Gracias Darin, En este –

+1

@Steve Ward, hizo lo que quiere solicitar algo con su comentario? ¿Hay algo no claro sobre mi respuesta? –

+0

Gracias Darin. En este caso, este parámetro no es parte del modelo, ya que se suministra a cada acción pero nunca es utilizado por la acción (para hacer con la autenticación). Se acaba de usar en un filtro de acción global, por lo que el segundo enfoque parece ser el camino a seguir. Puedo analizarlo fuera del json, ya que parece ser la única forma de hacerlo ... –

0
protected override void OnActionExecuting(ActionExecutingContext ctx) {  
    //All my viewDto end with "viewDto" so following command is used to find them 
    KeyValuePair<string, object> dto = ctx.ActionParameters.FirstOrDefault(item => 
     item.Key.ToLower().EndsWith("viewdto") 
    ); 

    string postedData; 

    if (dto.Key != null) { 
     object viewData = dto.Value; 

     if (dto.Key.ToLower() == "viewdto") { 
      var stdStoryViewDto = dto.Value as StandardStoryViewDto; 
      //removing unnecessary stuff 
      stdStoryViewDto.Industries.Clear(); 
      stdStoryViewDto.TimeZones.Clear(); 
      viewData = stdStoryViewDto; 
     } 
     postedData = JsonConvert.SerializeObject(viewData); 
    } else { 
     postedData = string.Join(",", 
      Array.ConvertAll(ctx.ActionParameters.Keys.ToArray(), 
      key => key + "=" + ctx.ActionParameters[key]) 
     ); 
    } 
} 

variables postedData contiene datos en formato JSON que fue enviado a la acción