未被asp.net MVC动作方法接收的Json数据

本文关键字:Json 数据 方法 asp net MVC 未被 | 更新日期: 2023-09-27 17:50:07

我试图从客户端脚本获得一些数据到控制器,我正在对我的数据进行字符串化,因此我收到如下内容:

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

我需要在控制器上验证我的数据,然而,在我的行动中,我收到一个null出于某种原因,如果我使用对象或字符串?为什么呢?

我已经看了很多其他的帖子,但不清楚,我需要创建自己的自定义IValueProvider实现吗?我认为在ms futures assembly中有一个可用,我试图找到该文件,因为我不想要dll中的所有代码,但我找不到它…

请指教……

控制器:

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

编辑:我已经遵循了phill hack的帖子,但实际上有一些错误返回强类型对象到我的视图…

my ajax call.

{
        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) {  ... }

未被asp.net MVC动作方法接收的Json数据

你可以看看下面的博客文章,它说明了如何使用自定义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 });
}

正如Phil Haack解释的那样,这个自定义JsonValueProviderFactory只有在使用ASP时才有必要。. NET MVC 2和内置的ASP。. NET MVC 3,所以它应该开箱即用