سؤال

أحتاج إلى إخراج XML / ASX على صفحة ASPX. يتم إنشاء XML من الكود وراء وإرادة يبدو مثل هذا.

أنا أستخدم String Builder لإنشاء XML / ASX.

            (...)
            sb.AppendLine("<asx version='3.0'>");
            sb.AppendLine("<title> Spilliste </title>");
            while (i < pdc.Count)
            {
                sb.AppendLine("<entry>");
                sb.AppendLine("<title>" + pdc[i].PageName + "</title>");
                sb.AppendLine("<abstract> Ikke tilgjengelig</abstract>");
                sb.AppendLine("<ref>" + pdc[i].LinkURL + "</ref>");
                sb.AppendLine("</entry>");
                i++;
            }
            sb.AppendLine("</asx>");

            return sb.ToString();
            (...)

ولكن كيف يمكنني إخراج هذا؟

Response.Write لا يعمل من الكود وراء. وأنا ملحوظ للاستخدام <asp:label> في ملف ASPX ، لأنه يجب وضعه داخل العلامات. لدي أساسا صفحة ASPX فارغة.

ما يجب القيام به؟

هل كانت مفيدة؟

المحلول

لا تستخدم أ Page لهذا. في الأساس PageS هي لتقديم HTML. إذا كنت ترغب في إرسال XML أو الصور أو أي نوع آخر من البيانات لهذه المسألة ، فيجب عليك استخدام ملف .ashx وفئة تنفذها IHttpHandler.

يمكنك ان ترى هذا المثال حول كيفية تنفيذ الواجهة.

نصائح أخرى

reponse.write يجب أن يعمل من الكود وراء:

  Response.Write("some test");
  Response.Flush();

ولكن يجب عليك تنفيذ هذا الرمز بطريقة page_load. يجب عليك إعداد صفحة ASPX منفصلة لإنشاء XML وإعادة توجيه المستخدم تلك الصفحة. يجب أن تكون هذه الصفحة فارغة (فقط <%@ ... %> في ملف ASPX).

يجب عليك استخدام IHttpHandler لهذا - يمكنك تكوين عنوان URL الذي يتعامل معه أيضاً بواسطة صنع .ashx ملف (بسيط جدا) أو عن طريق تسجيلهم في web.config ملف, ، وهو أكثر مرونة ، ولكنه أكثر صعوبة منذ بناء الجملة مختلف بين الوضع الكلاسيكي والمتكامل IIS.

بعد ذلك ، ستحتاج إلى فئة بسيطة مع عضو واحد مهم - طريقة ProcessRequest تأخذ معلمة واحدة فقط - HTTPContext.

علاوة على ذلك ، تجنب استخدام stringBuilder لبناء XML. يمكنك استخدام فئات LINQ إلى XML أكثر أمانًا وأكثر مرونة طريق أسهل في كتابة أساليب المساعد لإنشاء أجزاء من شجرة XML بشكل صحيح ؛ ويمكنك الاستعلام وتحويل النتائج إلى التمهيد.

void ProcessRequest(HttpContext context) {
    var pdc = Enumerable.Range(0,10).Select(
        i=>new{PageName="Page"+i,LinkURL="Link"+i});                

    var xmlString = 
    new XElement("asx",
        new XAttribute("version","3.0"),
        new XElement("title","Spilliste"),
        pdc.Select(pdcElem=>
            new XElement("entry",
                new XElement("title",pdcElem.PageName),
                new XElement("abstract","Ikke tilgjengelig"),
                new XElement("ref",pdcElem.LinkURL)
            )
        )
    ).ToString(SaveOptions.DisableFormatting);

    //don't forget to handle headers and set things like content-type too!
    context.Response.Write(xmlString);
}

والسبب في أن هذا النهج أفضل من اختراق ملف .aspx هو أنه على الرغم من أنه ممكن في ملف .aspx ، ستحتاج إلى محاربة الإطار للوصول إلى هناك - مجموعة كاملة من البنية التحتية ستعرض في طريقك ، وربما تشويش بمهارة بمهارة إخراجك قبل أن يصل إلى العميل. أسهل طريقة للتخلص من ذلك هي استخدام معالج أكثر عارية إلى المعدن لا يهدف على وجه التحديد إلى استضافة عناصر التحكم ASPX وإنشاء HTML.

    Response.ClearHeaders();
    Response.ContentType = "text/xml;charset=UTF-8";
    string xmlString = "<aaa>sai</aaa>";
    Response.Write(xmlString);
    Response.End();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top