- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个基于 dojo 框架的网络应用。
我决定使用 dojox.data.JsonRestStore用于与服务器通信。
例如,我在 Json 中有这样的订单(电子商务)表示:
{
id: int,
name: str,
date: str,
items: [
{
id: int,
name: str,
pcs: int,
price: int,
total: int
}, ...
]
}
Order 有一些基本属性(id、name、date),它还包含订购商品的数组。
我不确定这是否是好的 (REST) 设计,我想知道订购的项目是否应该在单独的资源中(因此在单独的 jsonRestStore 中)。
我想当我想在 dojo Form 中显示 Orders 的基本属性而在 dojo Datagrid 中显示订购的项目时,我可能会遇到当前对象模型的问题。
所以我的问题是,我当前的方法是否可行 - 在创建 REST 客户端应用程序方面?另外,在 dojo 中使用数据网格实现我的示例表单的正确方法是什么?
最佳答案
虽然您的设计是 RESTful 的,并且 REST 架构中没有任何东西需要它,但我认为大多数人会同意保持资源分离是最好的方法。如果你 checkout Restful Web Services他们将此描述为面向资源的架构。
我已经制定了一个示例,将订单和项目保存在单独的 JsonRestStores 中,并允许您通过 Dojo 表单显示订单对象,并通过 Dojo DataGrid 显示订单的项目。我认为代码很简单,我还在代码中添加了一些注释来尝试理清思路。
我创建了一个简单的 ASP.NET MVC 3 后端来为示例提供一些虚拟数据。我也发布了该代码,尽管您实际上只对代码的“查看”部分感兴趣,但后端代码也可以帮助您找出或更改您拥有的任何后端代码。
查看:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JsonRestStore Datagrid Example</title>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/resources/dojo.css"/>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dijit/themes/tundra/tundra.css"/>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojox/grid/resources/Grid.css"/>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojox/grid/resources/tundraGrid.css"/>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/dojo.xd.js' djConfig="parseOnLoad:true"></script>
<script type="text/javascript">
dojo.require("dojox.data.JsonRestStore");
dojo.require("dojox.grid.DataGrid");
dojo.require("dijit.form.DateTextBox");
dojo.require("dojox.grid.cells.dijit");
dojo.require("dojo.date.locale");
var item_structure = null;
dojo.ready(function () {
setItemTableStructure();
//retrieve a single order
//expects json to look like
// {"Id":2,"Name":"Order Name 2","Date":"\/Date(1321135185260)\/","Items":{"Ref":"/Order/2/Items"}}
order_store = new dojox.data.JsonRestStore({ target: "/Order/2", idAttribute: "Id" });
order_store.fetch({
onComplete: function (item) {
//this method is called after an item is fetched into the store
//item here is the order json object
var orderId = new dijit.form.TextBox({ value: order_store.getValue(item, 'Id') }, 'orderId');
var orderName = new dijit.form.TextBox({ value: order_store.getValue(item, 'Name') }, 'orderName');
var orderDate = new dijit.form.DateTextBox({ value: parseJsonDate(order_store.getValue(item, 'Date')) }, 'orderDate');
var items = order_store.getValue(item, 'Items').Ref;
//make a call to retrieve the items that are contained within a particular order
//expects a json object that looks like
//[{"Ref":"/Item/1"},{"Ref":"/Item/2"},{"Ref":"/Item/3"},{"Ref":"/Item/4"},{"Ref":"/Item/5"}]
var xhrArgs = {
url: items,
handleAs: "json",
load: loadOrder, //main method
error: function (error) {
console.log(error);
}
}
var deferred = dojo.xhrGet(xhrArgs);
}
});
});
//This is the main method
function loadOrder(data) {
var itemIds = "";
dojo.forEach(data, function(item, i){
itemIds += item.Ref.charAt(item.Ref.length-1);
itemIds += ",";
});
itemIds = itemIds.substring(0, itemIds.length-1);
//build the backend to accept a comma seperated list of item ids
//like /Item/1,2,3
item_store = new dojox.data.JsonRestStore({target:"/Item/" + itemIds, idAttribute:"Id"});
items = new dojox.grid.DataGrid({
name: "items",
formatter: function(date) {
if (date) return dojo.date.locale.format(parseJsonDate(date), {
selector: "Date"
})
},
structure: item_structure,
store: item_store
}, dojo.byId('orderItems'));
items.startup();
}
function setItemTableStructure() {
item_structure = [
{
field: 'Id'
},
{
field: 'Name'
},
{
field: 'Price'
},
{
field: 'Date',
type: dojox.grid.cells.DateTextBox,
widgetProps: {
selector: "Date"
},
formatter: function(v) {
if (v) return dojo.date.locale.format(parseJsonDate(v), {
selector: 'Date'
})
}
}];
}
function parseJsonDate(jsonDate) {
var offset = new Date().getTimezoneOffset() * 60000;
var parts = /\/Date\((-?\d+)([+-]\d{2})?(\d{2})?.*/.exec(jsonDate);
if (parts[2] == undefined)
parts[2] = 0;
if (parts[3] == undefined)
parts[3] = 0;
return new Date(+parts[1] + offset + parts[2]*3600000 + parts[3]*60000);
}
</script>
</head>
<body>
<h1>Json Rest Store with DataGrid Example</h1><br />
<form style='margin: 10px' action='post'>
<h2>Order</h2>
<input id='orderId' />
<input id='orderName' />
<input id='orderDate' />
</form>
<h2>Items</h2>
<div id='orderItems'></div>
</body>
</html>
模型:
using System;
namespace OrdersRestService.Models
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public DateTime Date { get; set; }
}
}
public class Order
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Date { get; set; }
public Reference Items { get; set; }
}
public class Reference
{
public string Ref { get; set; }
}
Controller :
namespace OrdersRestService.Controllers
{
public class OrderController : Controller
{
public ActionResult Index(string id)
{
Order order = new Order
{
Id = Convert.ToInt32(id),
Name = "Order Name " + id,
Date = DateTime.Now,
Items = new Reference
{
Ref = "/Order/" + id + "/Items"
}
};
return Json(order, JsonRequestBehavior.AllowGet);
}
public ActionResult Items()
{
List<Reference> items = new List<Reference>();
for (int i = 1; i <= 5; i++)
{
Reference r = new Reference();
r.Ref = "/Item/" + i;
items.Add(r);
}
return Json(items, JsonRequestBehavior.AllowGet);
}
}
public class ItemController : Controller
{
public ActionResult Index(string id)
{
List<Item> items = new List<Item>();
foreach (string itemid in id.Split(','))
{
Item item = new Item
{
Id = Convert.ToInt32(itemid),
Name = "Item Name " + itemid,
Date = DateTime.Now,
};
items.Add(item);
}
return Json(items, JsonRequestBehavior.AllowGet);
}
}
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
全局.aspx.cs
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"DefaultWithAction", // Route name
"{controller}/{id}/{action}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
关于javascript - jsonRest 复杂结构与 dojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073904/
我想使用 Dojo JsonRest 从 REST 服务读取 JSON 数据。 REST 服务需要用户名和密码作为基本身份验证字符串。一开始,我对这个字符串进行了硬编码。现在,我尝试了以下方法:
我正在开发一个基于 dojo 框架的网络应用。 我决定使用 dojox.data.JsonRestStore用于与服务器通信。 例如,我在 Json 中有这样的订单(电子商务)表示: { id: in
我正在尝试将增强型网格与 Dojo JSONREST 结合使用,但遇到了一些问题。 我一直在查找一些示例,但无法弄清楚如何做我需要的。 在下面的代码中,我的 rest 服务采用两个参数,并且对服务的查
运行道场1.8.4 使用 JsonRest(不是 JsonRestStore),我向端点发出 put 请求,然后获取结果并从请求响应中收集位置信息,如下所示: var promise = myJson
在 dojo/store/JsonRest 存储上使用“add”或“put”时,我希望有一个用于服务器响应的事件处理程序,无论是错误还是成功。 我尝试在“add”调用中添加诸如 error: func
我的项目使用 JsonRest 存储来访问其数据。一切都很好。问题是,当服务器返回错误时,即使调用了正确的代码部分,并且功能正常工作,该对象也会向控制台记录一个丑陋的错误。 我的代码: functio
我使用带有 jsonrest 的 Gridx 作为存储和分页模块。过滤只能在客户端完成吗?目前它向 jsonrest 存储发送请求并查询服务器。 最佳答案 是的,可以做到,看这个: https://g
我可以使用FilteringSelect: var jsonStore = new JsonRest ({ target: "/ajax_script/autocomplete?term1=
我想使用 QUnit 针对 Dojo JsonRest Store 编写集成测试。该测试应验证 JsonRest 是否与我编写的 REST API 集成。 目前我有以下代码,从 QUnit 网站复制:
谁能告诉我应该使用哪个 restStore 实现?我认为 dojo.store.JsonRest 是正确的库,因为它是最新的实现,但一位同事说他在某个地方读过(我知道不是很有帮助)我们应该仍然使用 d
我已成功设置 FilteringSelect 以使用 JsonRest 存储动态查询服务器中的项目。我的问题是当我尝试最初设置具有特定值的下拉列表时。 dojo.ready(function
Dojo dojo/store/JsonRest API Reference 请查看Method and RESTful Mapping Section 那里写着我的服务器应该遵循 RFC 2616
根据这篇文章Remove String from JSON ,我想用 JSON 数据填充 Dojo 选择框。问题是我必须先更改 JSON 数据,然后才能将数据分发到 dijit.form.select
我想知道是否有任何方法可以在自动执行 JsonRest 存储的 Get ajax 请求 (xhr.get) 中设置我自己的自定义 http header 。 有一个相关的主题,但没有很好的解决方案:
我一直在关注这个 tutorial关于将商店连接到树,本教程中详细介绍的所有内容都可以正常工作。但我不知道如何从树中删除条目。使用 store.remove (itemid) 确实会触发对 DELET
有没有办法用 JSON 结构中的子对象填充 dojox/grid/EnhancedGrid 的列?例如,如果我有一个看起来像这样的 JSON 行: { id: 2,
我有一个 OnDemandGrid,其中有一列,我想用我构建的自定义 Dojo 小部件填充该列。用于填充每个小部件的数据来自 Solr 查询。由于我预计可能有数千个搜索结果,因此我需要使用 JsonR
我正在使用 Dojo JsonREST 存储与服务器上的 RESTful API 进行通信。 GET 和 QUERY 方法与异步回调处理程序配合得很好。然而,在 JsonREST 存储上发布新对象的
我在尝试连接到提供 Arcgis Javascript API docs 的示例休息服务时收到以下错误. No 'Access-Control-Allow-Origin' header is pres
在 dojo.store.JsonRest 中如何设置 header "Accept"值为 application/json 的 puting 或 posting? var dataStore = n
我是一名优秀的程序员,十分优秀!