//生成订单并跳转 protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) { switch (e.CommandName) { case "order": { var rpt = e.Item.FindControl("rptProduct") as Repeater; var shopId = e.CommandArgument.ToString(); var cookieName = "shop_" + shopId; var lblList = new Dictionary<string,string>();//产品Id和数量键值对 rpt.Controls.OfType<RepeaterItem>().ToList().ForEach(rItem=> { if (rItem.ItemType==ListItemType.Item || rItem.ItemType == ListItemType.AlternatingItem) { lblList.Add((rItem.FindControl("lblAmount") as Label).Attributes["data-pid"],(rItem.FindControl("hfAmount") as HiddenField).Value); } }); var length = Request.Cookies[cookieName].Values.Keys.Count; int p_num = 0; for (int i = 0; i < length; i++) { var httpCookie = Request.Cookies[cookieName]; if (httpCookie != null) { var key = Request.Cookies[cookieName].Values.Keys[i]; string tmpStr=Request.Cookies[cookieName].Values[key]; int tmpInt = Convert.ToInt32(tmpStr); p_num += tmpInt; httpCookie.Values[key] = lblList.Single(p => p.Key == key).Value; } } if (p_num <= 0) { WebUtil.Alert("数量必须大于0"); return; } Response.Redirect("UserSubmitOrder.aspx?shopid="+shopId); break; } } }
/// <summary> /// Serializes the given graph to the given filepath using Xml data format. /// </summary> internal static void Serialize(RDFGraph graph, String filepath) { try { #region serialize using (XmlTextWriter rdfxmlWriter = new XmlTextWriter(filepath, Encoding.UTF8)) { XmlDocument rdfDoc = new XmlDocument(); rdfxmlWriter.Formatting = Formatting.Indented; #region xmlDecl XmlDeclaration xmlDecl = rdfDoc.CreateXmlDeclaration("1.0", "UTF-8", null); rdfDoc.AppendChild(xmlDecl); #endregion #region rdfRoot XmlNode rdfRoot = rdfDoc.CreateNode(XmlNodeType.Element, RDFVocabulary.RDF.PREFIX + ":RDF", RDFVocabulary.RDF.BASE_URI); XmlAttribute rdfRootNS = rdfDoc.CreateAttribute("xmlns:" + RDFVocabulary.RDF.PREFIX); XmlText rdfRootNSText = rdfDoc.CreateTextNode(RDFVocabulary.RDF.BASE_URI); rdfRootNS.AppendChild(rdfRootNSText); rdfRoot.Attributes.Append(rdfRootNS); #region prefixes //Write the graph's prefixes (except for "rdf", which has already been written) graph.GraphMetadata.Namespaces.ForEach(p => { if (!p.Prefix.Equals(RDFVocabulary.RDF.PREFIX, StringComparison.Ordinal) && !p.Prefix.Equals("base", StringComparison.Ordinal)) { XmlAttribute pfRootNS = rdfDoc.CreateAttribute("xmlns:" + p.Prefix); XmlText pfRootNSText = rdfDoc.CreateTextNode(p.ToString()); pfRootNS.AppendChild(pfRootNSText); rdfRoot.Attributes.Append(pfRootNS); } }); //Write the graph's base uri to resolve eventual relative #IDs XmlAttribute pfBaseNS = rdfDoc.CreateAttribute(RDFVocabulary.XML.PREFIX + ":base"); XmlText pfBaseNSText = rdfDoc.CreateTextNode(graph.Context.ToString()); pfBaseNS.AppendChild(pfBaseNSText); rdfRoot.Attributes.Append(pfBaseNS); #endregion #region linq //Group the graph's triples by subj var groupedList = (from triple in graph orderby triple.Subject.ToString() group triple by new { subj = triple.Subject.ToString() }); #endregion #region graph //Iterate over the calculated groups Dictionary<RDFResource, XmlNode> containers = new Dictionary<RDFResource, XmlNode>(); //Floating containers have reification subject which is never object of any graph's triple Boolean floatingContainers = graph.GraphMetadata.Containers.Keys.Any(k => graph.Triples.Values.Count(v => v.Object.Equals(k)) == 0); //Floating collections have reification subject which is never object of any graph's triple Boolean floatingCollections = graph.GraphMetadata.Collections.Keys.Any(k => graph.Triples.Values.Count(v => v.Object.Equals(k)) == 0); foreach (var group in groupedList) { #region subj //Check if the current subj is a container or a collection subj: if so it must be //serialized in the canonical RDF/XML way instead of the "rdf:Description" way XmlNode subjNode = null; String subj = group.Key.subj; //It is a container subj, so add it to the containers pool if (graph.GraphMetadata.Containers.Keys.Any(k => k.ToString().Equals(subj, StringComparison.Ordinal)) && !floatingContainers) { switch (graph.GraphMetadata.Containers.Single(c => c.Key.ToString().Equals(subj, StringComparison.Ordinal)).Value) { case RDFModelEnums.RDFContainerTypes.Bag: subjNode = rdfDoc.CreateNode(XmlNodeType.Element, RDFVocabulary.RDF.PREFIX + ":Bag", RDFVocabulary.RDF.BASE_URI); containers.Add(new RDFResource(subj), subjNode); break; case RDFModelEnums.RDFContainerTypes.Seq: subjNode = rdfDoc.CreateNode(XmlNodeType.Element, RDFVocabulary.RDF.PREFIX + ":Seq", RDFVocabulary.RDF.BASE_URI); containers.Add(new RDFResource(subj), subjNode); break; case RDFModelEnums.RDFContainerTypes.Alt: subjNode = rdfDoc.CreateNode(XmlNodeType.Element, RDFVocabulary.RDF.PREFIX + ":Alt", RDFVocabulary.RDF.BASE_URI); containers.Add(new RDFResource(subj), subjNode); break; } } //It is a subj of a collection of resources, so do not append triples having it as a subject //because we will reconstruct the collection and append it as a whole else if (graph.GraphMetadata.Collections.Keys.Any(k => k.ToString().Equals(subj, StringComparison.Ordinal)) && graph.GraphMetadata.Collections.Single(c => c.Key.ToString().Equals(subj, StringComparison.Ordinal)).Value.ItemType == RDFModelEnums.RDFItemTypes.Resource && !floatingCollections) { continue; } //It is neither a container or a collection subj else { subjNode = rdfDoc.CreateNode(XmlNodeType.Element, RDFVocabulary.RDF.PREFIX + ":Description", RDFVocabulary.RDF.BASE_URI); //<rdf:Description rdf:nodeID="blankID"> XmlAttribute subjNodeDesc = null; XmlText subjNodeDescText = rdfDoc.CreateTextNode(group.Key.subj); if (group.Key.subj.StartsWith("bnode:")) { subjNodeDescText.InnerText = subjNodeDescText.InnerText.Replace("bnode:", String.Empty); subjNodeDesc = rdfDoc.CreateAttribute(RDFVocabulary.RDF.PREFIX + ":nodeID", RDFVocabulary.RDF.BASE_URI); } //<rdf:Description rdf:about="subjURI"> else { subjNodeDesc = rdfDoc.CreateAttribute(RDFVocabulary.RDF.PREFIX + ":about", RDFVocabulary.RDF.BASE_URI); } subjNodeDesc.AppendChild(subjNodeDescText); subjNode.Attributes.Append(subjNodeDesc); } #endregion #region predObjList //Iterate over the triples of the current group foreach (var triple in group) { //Do not append the triple if it is "SUBJECT rdf:type rdf:[Bag|Seq|Alt]" if (!(triple.Predicate.Equals(RDFVocabulary.RDF.TYPE) && (subjNode.Name.Equals(RDFVocabulary.RDF.PREFIX + ":Bag", StringComparison.Ordinal) || subjNode.Name.Equals(RDFVocabulary.RDF.PREFIX + ":Seq", StringComparison.Ordinal) || subjNode.Name.Equals(RDFVocabulary.RDF.PREFIX + ":Alt", StringComparison.Ordinal)))) { #region pred String predString = triple.Predicate.ToString(); //"<predPREF:predURI" RDFNamespace predNS = (RDFNamespaceRegister.GetByNamespace(predString) ?? RDFModelUtilities.GenerateNamespace(predString, false)); //Refine the pred with eventually necessary sanitizations String predUri = predString.Replace(predNS.ToString(), predNS.Prefix + ":") .Replace(":#", ":") .TrimEnd(new Char[] { ':', '/' }); //Sanitize eventually detected automatic namespace if (predUri.StartsWith("autoNS:")) { predUri = predUri.Replace("autoNS:", string.Empty); } //Do not write "xmlns" attribute if the predUri is the context of the graph XmlNode predNode = null; if (predNS.ToString().Equals(graph.Context.ToString(), StringComparison.Ordinal)) { predNode = rdfDoc.CreateNode(XmlNodeType.Element, predUri, null); } else { predNode = rdfDoc.CreateNode(XmlNodeType.Element, predUri, predNS.ToString()); } #endregion #region object if (triple.TripleFlavor == RDFModelEnums.RDFTripleFlavors.SPO) { //If the object is a container subj, we must append its entire node saved in the containers dictionary if (containers.Keys.Any(k => k.Equals(triple.Object)) && !floatingContainers) { predNode.AppendChild(containers.Single(c => c.Key.Equals(triple.Object)).Value); } //Else, if the object is a subject of a collection of resources, we must append the "rdf:parseType=Collection" attribute to the predicate node else if (graph.GraphMetadata.Collections.Keys.Any(k => k.Equals(triple.Object)) && graph.GraphMetadata.Collections.Single(c => c.Key.Equals(triple.Object)).Value.ItemType == RDFModelEnums.RDFItemTypes.Resource && !floatingCollections) { XmlAttribute rdfParseType = rdfDoc.CreateAttribute(RDFVocabulary.RDF.PREFIX + ":parseType", RDFVocabulary.RDF.BASE_URI); XmlText rdfParseTypeText = rdfDoc.CreateTextNode("Collection"); rdfParseType.AppendChild(rdfParseTypeText); predNode.Attributes.Append(rdfParseType); //Then we append sequentially the collection elements List<XmlNode> collElements = RDFModelUtilities.ReconstructCollection(graph.GraphMetadata, (RDFResource)triple.Object, rdfDoc); collElements.ForEach(c => predNode.AppendChild(c)); } //Else, threat it as a traditional object node else { String objString = triple.Object.ToString(); XmlAttribute predNodeDesc = null; XmlText predNodeDescText = rdfDoc.CreateTextNode(objString); // rdf:nodeID="blankID"> if (objString.StartsWith("bnode:")) { predNodeDescText.InnerText = predNodeDescText.InnerText.Replace("bnode:", String.Empty); predNodeDesc = rdfDoc.CreateAttribute(RDFVocabulary.RDF.PREFIX + ":nodeID", RDFVocabulary.RDF.BASE_URI); } // rdf:resource="objURI"> else { predNodeDesc = rdfDoc.CreateAttribute(RDFVocabulary.RDF.PREFIX + ":resource", RDFVocabulary.RDF.BASE_URI); } predNodeDesc.AppendChild(predNodeDescText); predNode.Attributes.Append(predNodeDesc); } } #endregion #region literal else { #region plain literal if (triple.Object is RDFPlainLiteral) { RDFPlainLiteral pLit = (RDFPlainLiteral)triple.Object; // xml:lang="plitLANG"> if (pLit.Language != String.Empty) { XmlAttribute plainLiteralLangNodeDesc = rdfDoc.CreateAttribute(RDFVocabulary.XML.PREFIX + ":lang", RDFVocabulary.XML.BASE_URI); XmlText plainLiteralLangNodeDescText = rdfDoc.CreateTextNode(pLit.Language); plainLiteralLangNodeDesc.AppendChild(plainLiteralLangNodeDescText); predNode.Attributes.Append(plainLiteralLangNodeDesc); } } #endregion #region typed literal // rdf:datatype="tlitURI"> else { RDFTypedLiteral tLit = (RDFTypedLiteral)triple.Object; XmlAttribute typedLiteralNodeDesc = rdfDoc.CreateAttribute(RDFVocabulary.RDF.PREFIX + ":datatype", RDFVocabulary.RDF.BASE_URI); XmlText typedLiteralNodeDescText = rdfDoc.CreateTextNode(tLit.Datatype.ToString()); typedLiteralNodeDesc.AppendChild(typedLiteralNodeDescText); predNode.Attributes.Append(typedLiteralNodeDesc); } #endregion //litVALUE</predPREF:predURI>" XmlText litNodeDescText = rdfDoc.CreateTextNode(((RDFLiteral)triple.Object).Value); predNode.AppendChild(litNodeDescText); } #endregion subjNode.AppendChild(predNode); } } //Raw containers must not be written as-is, instead they have to be saved //and attached when their subj is found later as object of a triple if (!subjNode.Name.Equals(RDFVocabulary.RDF.PREFIX + ":Bag", StringComparison.Ordinal) && !subjNode.Name.Equals(RDFVocabulary.RDF.PREFIX + ":Seq", StringComparison.Ordinal) && !subjNode.Name.Equals(RDFVocabulary.RDF.PREFIX + ":Alt", StringComparison.Ordinal)) { rdfRoot.AppendChild(subjNode); } #endregion } #endregion rdfDoc.AppendChild(rdfRoot); #endregion rdfDoc.Save(rdfxmlWriter); } #endregion } catch (Exception ex) { throw new RDFModelException("Cannot serialize Xml because: " + ex.Message, ex); } }