1

如果您有以下情况:

  1. Asp.Net MVC 2 项目具有定义视图模型的对象类。
  2. 使用 JSON 将这些模型序列化到 Web 浏览器客户端。
  3. 客户向对象添加信息,例如发票上的订单行。
  4. 客户端将对象发送回服务器进行处理。

有没有办法与客户端共享 JSON 对象的数据合约?我真的想让服务器使用 Order 工厂创建一个 Order,然后将其发送给客户端。客户端使用数据合同添加订单行,并将完全填充的对象作为 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 的示例或网页链接都会非常有帮助。

4

1 回答 1

1

好吧,给定一个示例模型:

[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 对象的实例,该对象可以反序列化为您的服务器端实例。

于 2010-06-10T13:25:01.750 回答