ASP.net MVC 3 - Получение опубликованных данных JSON в OnActionExecuting - PullRequest
6 голосов
/ 23 февраля 2011

Я отправляю данные в актин с помощью метода $ .ajax в jquery, определяя данные, которые будут опубликованы, используя поле данных для передачи строковых значений JSON.

Они опубликованы в действии ОК, но я не могу получить их в фильтре действия OnActionExecuting (они не являются частью коллекций Forms или Params). Есть ли способ их получить, а если нет, подскажите, почему нет?

Ответы [ 2 ]

11 голосов
/ 23 февраля 2011

Если ваше действие принимает модель:

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

вы можете напрямую указать значение этого параметра, потому что JsonValueProviderFactory уже проанализировал бы его:

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

Если модели нет (почему ее нет?), Вы можете прочитать JSON из потока запросов:

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();
    }
}
0 голосов
/ 21 мая 2013
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])
        );
    }
}

переменная postsData содержит данные в формате JSON, которые были отправлены в действие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...