asp.net mvc动作方法没有收到json数据

时间:2011-04-14 16:34:18

标签: c# json asp.net-mvc-2

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

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

我需要在控制器上验证我的数据,但是,在我的操作中,由于某些原因,我收到的是null,如果我使用对象或字符串?那是为什么?

我已经看了很多其他帖子,但目前尚不清楚,我是否需要创建自己的自定义IValueProvider实现?我认为在ms期货汇编中有一个可用,我试图找到该文件,因为我不想让dll中的所有代码,但我找不到它...

任何指针都会受到赞赏......

控制器:

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

编辑:我已经通过phill haack关注帖子,但实际上将强类型对象返回到我的视图中有一些错误......

我的ajax电话..

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

我创建了一个自定义值提供程序...

public class 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 :(得分:0)

您可以查看following blog post,其中说明了如何使用自定义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解释的那样,只有在使用ASP.NET MVC 2并且内置ASP.NET MVC 3时才需要这个自定义JsonValueProviderFactory,因此它应该是开箱即用的。