2

我有 Elmah 记录错误。错误会保存完整的表单发布信息。我可以通过 URL 访问这些错误及其 XML 或 JSON 表示。我想调试的一些错误发布了很多值,重现这些错误非常困难且耗时。

我想要的是一种使用 elmah 日志信息填充特定发布操作所需的模型的方法。然后我可以在单元测试中使用这个模型,看看为什么会发生错误。

到目前为止,我已经尝试从 XML 和 JSON elamh 错误信息解析为模型。以下是我尝试从 JSON 解析的内容:

MyModel model = ParseTo<MyModel>("Url of elmah json error");
public static T ParseTo<T>(string UrlOfJson)
{
    string fullJsonString = string.Empty;
    using(var webClient = new WebClient())
    {
        fullJsonString = webClient.DownloadString(UrlOfJson);
    }

    JObject o = JObject.Parse(fullJsonString);
    string inputString = o.SelectToken("form").ToString();

    return JsonConvert.DeserializeObject<T>(inputString);
}

这几乎可以工作。几乎是因为它不能反序列化 List 对象。

给定以下模型:

public class MyModel
{
    public int CustomerId { get; set; }
    public List<Offer> Offers { get; set; }
}

public class Offer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

...而这个Json:

{
    "CustomerId": "4564",
    "Offers[0].Id": "635",
    "Offers[0].Name": "name1",
    "Offers[1].Id": "636",
    "Offers[1].Name": "name2",
}

...解析器无法序列化Offers属性,因为 Elmah 保存的 Json 格式不正确。它采用默认 ModelBinder 可以理解的格式,但是我如何针对这个 Json 运行它呢?

有什么想法可以将 Elamh 保存的 Json 序列化为模型对象吗?

4

2 回答 2

1

默认 MVC4 HomeController 中的完整工作示例:

using System;
using System.Collections.Generic;
using System.Web.Mvc;

namespace DefaultMvc4Application.Controllers
{
    public class HomeController : Controller
    {
        public class MyModel
        {
            public int CustomerId { get; set; }
            public List<Offer> Offers { get; set; }
        }

        public class Offer
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        public ActionResult Index()
        {
            string json = @"{
                                ""CustomerId"": ""4564"",
                                ""Offers[0].Id"": ""635"",
                                ""Offers[0].Name"": ""name1"",
                                ""Offers[1].Id"": ""636"",
                                ""Offers[1].Name"": ""name2"",
                            }";
            var dict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
            var form = new FormCollection();

            foreach (KeyValuePair<string, string> kvp in dict)
                form.Add(kvp.Key, kvp.Value);


            var model = new MyModel();
            UpdateModel<MyModel>(model, form);

            return View(model);
        }
    }
}

最后,您将获得正确填充的模型。

于 2013-05-17T18:13:17.153 回答
0

简化示例:

    FormCollection form = ParseTo<FormCollection>("Url of elmah json error");
    var instance = new MyModel();
    UpdateModel<MyModel>(instance, form.ToValueProvider());

所以,基本上,只将 JSON 反序列化为System.Web.Mvc.FormCollection第一个。或在 中NameValueCollection,然后您可以FormCollection从那里创建。然后,触发 MVC 绑定,您将获得模型。

此代码段应该在控制器操作中,以便您可以访问Controller.UpdateModel方法(或TryUpdateModel)。

于 2013-05-16T22:54:48.600 回答