данные json не получены методом действия asp.net mvc - PullRequest
0 голосов
/ 14 апреля 2011

Я пытаюсь получить данные на контроллер из клиентского скрипта, я строковые данные, поэтому я получаю что-то вроде:

{"Name":"","Description":"","FieldType":"radio","Fields":[{"Field":{"Name":"something","Value":"nameit"}},{"Field":{"Name":"something else","Value":"dontnameit"}}]}

Мне нужно будет проверить мои данные на контроллере, однако, в своем действии я получаю нулевое значение по какой-то причине, если я использую объект или строку? Почему это так?

Я просмотрел множество других постов, но неясно, нужно ли создавать собственную реализацию IValueProvider? Я думаю, что есть один доступный в сборке MS Futures, я пытался найти файл, так как я не хочу, чтобы весь код внутри DLL, но я не мог его найти ...

Любые указатели будут оценены ...

Контроллер:

[HttpPost]
public JsonResult AddField(string field) //or object
{
//code here
}

Редактировать: Я проследил за сообщением Филлом Хаком, но имел некоторые ошибки, фактически возвращая строго типизированный объект на мой взгляд ...

мой вызов ajax ..

{
        url: url,
        type: "post",
        dataType: 'json',
        traditional: true,
        data: jsondata, // { "field" : jsondata},
        contentType: 'application/json; charset=utf-8',
...
}

Я создал пользовательский поставщик значений ...

открытый класс Jsonify: ValueProviderFactory { public Jsonify () {}

    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        var jsonData = GetDeserializedJson(controllerContext);
        if (jsonData == null)
        {
            return null;
        }

        //currently used by mvc2 futures
        //return new DictionaryValueProvider<object>(backingStore, 
        //CultureInfo.CurrentCulture);
        // what do I return?

    }
private static object GetDeserializedJson(ControllerContext controllerContext)
        {
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            {
                // not JSON request
                return null;
            }

            StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
            string bodyText = reader.ReadToEnd();
            if (String.IsNullOrEmpty(bodyText))
            {
                // no JSON data
                return null;
            }

            //json.net
            var jsonData = JsonConvert.DeserializeObject<SurveyField>(bodyText);
            return jsonData;
        }
}

Контроллер:

public JsonResult AddSimpleField(SurveyField field) {  ... }

1 Ответ

0 голосов
/ 14 апреля 2011

Вы можете взглянуть на следующую запись в блоге , которая иллюстрирует, как вы можете использовать пользовательский JsonValueProviderFactory для отправки строки в кодировке JSON из клиентских сценариев в действие контроллера и получить это действие как строго типизированная модель и выгода от проверки связующего по умолчанию для модели:

[HttpPost]
public ActionResult AddField(SomeViewModel model)
{
    if (!ModelState.IsValid)
    {
        // the client sent an invalid data
        return Json(new { IsSuccess = false });
    }
    // the model passed validation => do some processing with this model
    return Json(new { IsSuccess = true });
}

Как объясняет Фил Хаак, этот пользовательский JsonValueProviderFactory необходим только в том случае, если вы работаете с ASP.NET MVC 2 и встроен в ASP.NET MVC 3, поэтому он должен работать "из коробки".

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