В ASP.NET MVC десериализуйте JSON до или в методе действия контроллера

WPF идет со многими преимуществами, такими как превосходные функции привязки данных, разделение проблем, разделение дизайна и логики и т.д.

Как разработчик, я наслаждаюсь способностью определить мой UI с помощью XAML в противоположность тому, чтобы быть связанным с разработчиком Windows Forms, и я чувствую себя хорошим, зная, что я могу рассчитывать на другого разработчика, чтобы заставить мое приложение выглядеть хорошим.

Лично я не забочусь, что более старые версии Windows не поддерживаются, но одна из больших проблем с WPF, это, (в настоящее время/когда-либо) не поддерживается Моно ( http://www.mono-project.com ), таким образом, приложения WPF не будут работать на Mac OS или Linux. (Altough приложения Silverlight будет).

, Если у Вас есть время и ресурсы для инвестирования в изучение WPF, сделайте это! Даже если Вы собираетесь быть записью приложения Silverlight для поддержки нескольких ОС.

, Если Вам нужны настольные приложения для работы палки нескольких ОС с SWF.

20
задан weilin8 26 September 2009 в 04:36
поделиться

4 ответа

Я решил свою проблему, реализовав фильтр действий; Пример кода приведен ниже. Из исследования я узнал, что есть еще одно решение, связующее устройство, как takepara , описанное выше. Но я действительно не знаю плюсов и минусов того или иного подхода.

Благодаря сообщению в блоге Стива Джентиле за это решение.

public class JsonFilter : ActionFilterAttribute
    {
        public string Parameter { get; set; }
        public Type JsonDataType { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
            {
                string inputContent;
                using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
                {
                    inputContent = sr.ReadToEnd();
                }

                var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
                filterContext.ActionParameters[Parameter] = result;
            }
        }
    }

[AcceptVerbs(HttpVerbs.Post)]
[JsonFilter(Parameter="user", JsonDataType=typeof(User))]
public ActionResult Submit(User user)
{
    // user object is deserialized properly prior to execution of Submit() function

    return View();
}
23
ответ дан 29 November 2019 в 23:33
поделиться

1. создать привязку пользовательской модели

  public class UserModelBinder : IModelBinder
  {
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
      User model;

      if(controllerContext.RequestContext.HttpContext.Request.AcceptTypes.Contains("application/json"))
      {
        var serializer = new JavaScriptSerializer();
        var form = controllerContext.RequestContext.HttpContext.Request.Form.ToString();
        model = serializer.Deserialize<User>(HttpUtility.UrlDecode(form));
      }
      else
      {
        model = (User)ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext);
      }

      return model;
    }
  }

2. добавить привязку модели в событие application_start

  ModelBinders.Binders[typeof(User)] = new UserModelBinder();

3. использовать jQuery $ .get / $. разместить в представлении клиентский код JavaScript.

  <% using(Html.BeginForm("JsonData","Home",new{},FormMethod.Post, new{id="jsonform"})) { %>

    <% = Html.TextArea("jsonarea","",new {id="jsonarea"}) %><br />

    <input type="button" id="getjson" value="Get Json" />
    <input type="button" id="postjson" value="Post Json" />
  <% } %>
  <script type="text/javascript">
    $(function() {
      $('#getjson').click(function() {
        $.get($('#jsonform').attr('action'), function(data) {
          $('#jsonarea').val(data);
        });
      });

      $('#postjson').click(function() {
        $.post($('#jsonform').attr('action'), $('#jsonarea').val(), function(data) {
          alert("posted!");
        },"json");
      });
    });
  </script>
11
ответ дан 29 November 2019 в 23:33
поделиться

Вы можете попробовать Json.NET . Документация довольно хороша, и она должна делать то, что вам нужно . Вы также захотите получить JsonNetResult , поскольку он возвращает ActionResult, который можно использовать в приложении ASP.NET MVC. Его довольно легко использовать.

Json.NET также хорошо работает с сериализацией даты. Более подробную информацию об этом можно найти здесь .

Надеюсь, это поможет.

5
ответ дан 29 November 2019 в 23:33
поделиться

Попробуйте это;

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Submit(FormCollection collection)
{
    User submittedUser = JsonConvert.DeserializeObject<User>(collection["user"]); 
    return View();
}
4
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: