سؤال

أنا ترقية إلى مفك 4 أمس واكتشفت مجرد خلل أن الترقية قدم.

لدي وجهة نظر الحلاقة التي يتم استخدامها لتوليد آر إس إس.لديها بعض العلامات مثل هذا (مبسط):

<item>
    <title>@post.BlogPost.Title</title> 
    <link>@Url.BlogPost(post.BlogPost, isAbsolute: true)</link>
</item>

في الحلاقة الإصدار الثاني ، هناك دعم خاص ل هتمل5 عناصر الفراغ.هذه العناصر الفارغة هي إغلاق ذاتي ، وليس لها علامة إغلاق.

للأسف, <link> هو أحد هذه العناصر.

هذا يعني أن ترميز الشفرة أعلاه لم يعد صالحا ، وفشل في وقت التشغيل.إزالة الإغلاق </link> العلامة يزيل الخطأ محلل ، ولكن يعني أنه لم يعد صالحا رسس.

وبالتالي, هل هناك طريقة للالتفاف على هذا, أو هو الحلاقة فقط مناسبة حقا لتوليد أتش تي أم أل 5?

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

المحلول 4

الجواب القصير على هذا السؤال يبدو أن الحلاقة ، كما أكثر من الإصدار 2 ، يرتبط هتمل لاستبعاد شمل.I طلب واحد من ديف للتأكيد, ، لذلك نأمل أن يعود.

انتهى بي الأمر تغيير طريقة بلدي لاستخدام لينق إلى شمل والعرف ActionResult, ، تجاوز الحلاقة وبالفعل أي محرك عرض:

[HttpGet]
[OutputCache(Duration = 300)]
public ActionResult Feed()
{
    var result = new XmlActionResult(
        new XDocument(
            new XElement("rss",
                new XAttribute("version", "2.0"),
                new XElement("channel",
                    new XElement("title", "My Blog")
                    // snip
                )
            )
        )
    );

    result.MimeType = "application/rss+xml";

    return result;
}

يتطلب هذا العرف التالي ActionResult:

public sealed class XmlActionResult : ActionResult
{
    private readonly XDocument _document;

    public Formatting Formatting { get; set; }
    public string MimeType { get; set; }

    public XmlActionResult([NotNull] XDocument document)
    {
        if (document == null)
            throw new ArgumentNullException("document");

        _document = document;

        // Default values
        MimeType = "text/xml";
        Formatting = Formatting.None;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.ContentType = MimeType;

        using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, Encoding.UTF8) { Formatting = Formatting })
            _document.WriteTo(writer);
    }
}

نصائح أخرى

سأفعل ذلك مثل هذا:

<item>
   <title>
      @post.BlogPost.Title
   </title>

   @Html.Raw("<link>")
      @Url.BlogPost(post.BlogPost, isAbsolute: true)
   @Html.Raw("</link>")
</item>

سوف مصدر ولدت تبدو مثل هذا:

<item>
    <title>
        Google
    </title>

     <link>
         http://www.google.se
    </link>
</item>

الآن أذهب مع هذا الحل:

 @Html.Raw(string.Format(@"<param name=""{0}"">{1}</param>",Name, Value)) 

منذ أن فتح ألكسندر تاران مكافأة على هذا السؤال في البحث عن إجابة محددة لهذا ، اعتقدت أنني سأتحقق من شفرة المصدر الحلاقة على كوديبلكس وتقديم بعض التفاصيل.

أولا ، نلقي نظرة على HtmlMarkupParser.أنه يحتوي على هذه البيانات المرجعية:

//From http://dev.w3.org/html5/spec/Overview.html#elements-0
private ISet<string> _voidElements = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen",
    "link", "meta", "param", "source", "track", "wbr"
};

يتعرض هذا عبر HtmlMarkupParser.VoidElements, ، والاستخدام الوحيد لهذه الخاصية في HtmlMarkupParser.RestOfTag(...).هذا محلل يسير عبر سلسلة من الرموز المميزة.المقتطف ذي الصلة من التعليمات البرمجية هو:

if (VoidElements.Contains(tagName))
{
    // Technically, void elements like "meta" are not allowed to have end tags. Just in case they do,
    // we need to look ahead at the next set of tokens. If we see "<", "/", tag name, accept it and the ">" following it
    // Place a bookmark
    int bookmark = CurrentLocation.AbsoluteIndex;

    // Skip whitespace
    IEnumerable<HtmlSymbol> ws = ReadWhile(IsSpacingToken(includeNewLines: true));

    // Open Angle
    if (At(HtmlSymbolType.OpenAngle) && NextIs(HtmlSymbolType.Solidus))
    {
        HtmlSymbol openAngle = CurrentSymbol;
        NextToken();
        Assert(HtmlSymbolType.Solidus);
        HtmlSymbol solidus = CurrentSymbol;
        NextToken();
        if (At(HtmlSymbolType.Text) && String.Equals(CurrentSymbol.Content, tagName, StringComparison.OrdinalIgnoreCase))
        {
            // Accept up to here
            Accept(ws);
            Accept(openAngle);
            Accept(solidus);
            AcceptAndMoveNext();

            // Accept to '>', '<' or EOF
            AcceptUntil(HtmlSymbolType.CloseAngle, HtmlSymbolType.OpenAngle);
            // Accept the '>' if we saw it. And if we do see it, we're complete
            return Optional(HtmlSymbolType.CloseAngle);
        } // At(HtmlSymbolType.Text) && String.Equals(CurrentSymbol.Content, tagName, StringComparison.OrdinalIgnoreCase)
    } // At(HtmlSymbolType.OpenAngle) && NextIs(HtmlSymbolType.Solidus)

    // Go back to the bookmark and just finish this tag at the close angle
    Context.Source.Position = bookmark;
    NextToken();
}

هذا يعني أنه سيتم تحليل ما يلي بنجاح:

<link></link>

ومع ذلك ، فإن المظهر محدود ، مما يعني أن أي رموز إضافية شوهدت قبل علامة الإغلاق تتسبب في فشلها:

<link>Some other tokens</link>

قد يكون من الممكن توسيع نطاق النظررئيس في هذه الحالة.إذا كان أي شخص حريص ، فإنها يمكن أن توفر طلب سحب لفريق مفك.

هتمل5 لينك هو عنصر خاص يستخدم في رأس لأوراق الأنماط وما شابه ذلك.

آر إس إس الخاص بك لا ينبغي أن يكون هتمل5 ولكن شيء من هذا القبيل

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">

هل يمكن أن يكون هذا في وحدة تحكم تخطيط أن آر إس إس الخاص بك سوف تستخدم

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    @RenderBody()
</rss>

طريقة بديلة لقد فعلت ذلك بريفيوسلي هو أن يكون وجهة نظر فارغة تماما ثم وحدة تحكم أدناه:

    [NHibernateActionFilter]
    public AtomActionResult Feed()
    {
        var dto = _service.GetThings(NHibernateSession);
        var items = Mapper.Map<List<ThingDto>, List<SyndicationItem>>(dto);
        var url = HttpContextWrapper.Request.UrlReferrer;
        var feed = new SyndicationFeed("MyTitle", "MyByline", url, items)
        {
            Copyright = new TextSyndicationContent("© 2012 SO"),
            Language = "en-IE"
        };
        return new AtomActionResult(feed);
    }

من الجدير بالذكر هو System.ServiceModel.Syndication.SyndicationFeed

وهذا هو بلدي نتيجة مخصصة

 public class AtomActionResult : ActionResult
    {
        readonly SyndicationFeed _feed;

        public AtomActionResult() { }

        public AtomActionResult(SyndicationFeed feed)
        {
            _feed = feed;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            //context.HttpContext.Response.ContentType = "application/atom+xml";
            //chrome does not yet support atom+xml 
            //http://code.google.com/p/chromium/issues/detail?id=104358
            context.HttpContext.Response.ContentType = "application/xml";
            var formatter = new Atom10FeedFormatter(_feed);
            using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output))
            {
                formatter.WriteTo(writer);
            }
        }
    }

ما يمكنك فعله هو هذا:

@("<link>" + Url.BlogPost(post.BlogPost, isAbsolute: true) + "</link>")

أبسط من ذلك بكثير

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top