Asp.Net MVC 2: Любой способ поделиться контрактами данных с клиентской стороны javascript? - PullRequest
1 голос
/ 09 июня 2010

Если у вас есть следующее:

  1. Проект Asp.Net MVC 2 с классами объектов, которые определяют модели представлений.
  2. Сериализация этих моделей в клиенте веб-браузера с использованием JSON.
  3. Клиент добавляет информацию к объектам, например строку заказа в счете.
  4. Клиент отправляет объект обратно на сервер для обработки.

Есть ли способ?поделиться с клиентом контрактом данных для объектов JSON?Мне бы очень хотелось, чтобы сервер создал Заказ с использованием фабрики заказов, а затем отправил его клиенту.Клиент добавляет строки заказа, используя контракты данных, и отправляет обратно полностью заполненный объект как JSON.

Я действительно хотел бы сделать следующее в JavaScript на клиенте:

var order = myService.OrderFactory.GetNewClientOrderRequest();
order.description = "Some New Order";
var orderLine = myService.OrderFactory.GetNewClientOrderLine( order);
orderLine.setProductID( 1234);
orderLine.setQty( 1);
order.AddLine( orderLine);
if( order.SubmitOrder() == true) {
    //display confirmation
}

Любойпримеры или ссылки на веб-страницы в Asp.Net MVC 2 были бы очень полезны.

1 Ответ

1 голос
/ 10 июня 2010

Хорошо, учитывая пример модели:

[DataContract]
public class Item
{
  [DataMember]
  public string Title { get; set; }
}

Вы можете создать фильтр действий, который десериализует ваши объекты из JSON:

/// <summary>
/// Deserialises a DataContract parameter from its JSON equivalence.
/// </summary>
public class JsonParameterFilter : ActionFilterAttribute
{
  #region Properties
  /// <summary>
  /// Gets or sets the parameter name.
  /// </summary>
  public string Name { get; set; }

  /// <summary>
  /// Gets or sets the type of the parameter.
  /// </summary>
  public Type Type { get; set; }
  #endregion

  #region Methods
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var request = filterContext.HttpContext.Request;

    string contentType = request.ContentType;
    if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Contains("application/json")) 
    {
      var serialiser = new DataContractJsonSerializer(this.Type);
      var @object = serialiser.ReadObject(request.InputStream);

      filterContext.ActionParameters[Name] = @object;
    }
  }
  #endregion
}

И применить к вашему действию:

[JsonParameterFilter(Name = "item", Type = typeof(Item))]
public ActionResult ProcessItem(Item item)
{
  // Do stuff here

  return View();
}

Вам необходимо убедиться, что вы публикуете данные с типом содержимого "application / json":

var item = ItemFactory.GetNewItem();
item.Title = "Something";

var json = $.toJSON(item);
$.ajax({
  contentType: "application/json; charset=utf-8"
  data: json,
  dataType: "json",
  type: "post",
  url: "Controller/Action",
});

Очевидно, что ваша клиентская библиотека / скрипт должна быть в состояниисоздать экземпляр объекта javascript, который можно десериализовать как ваш экземпляр на стороне сервера.

...