如何防止剃刀逃脱

时间:2014-10-20 11:16:41

标签: asp.net-mvc razor

我正在尝试动态添加youtube视频代码到链接,但是razor会转义@符号。



//www.youtube.com/embed/@Model.MallVideos.Where( mv => mv.IsFeatured).FirstOrDefault().Video.Code




如果我像embed / @Model或embed / @ Model一样编写它 但现在URI已被破坏。

破解html的意思是,当结果呈现到浏览器中时,您会看到:



http://www.youtube.com/embed/@Model.MallVideos.Where( mv => mv.IsFeatured).FirstOrDefault().Video.Code




而不是



http://www.youtube.com/embed/fghnkhyth6uh




有趣的是,当我在我的网址中的任何其他地方使用/ @模型时,它的工作方式相同,只有这个特殊的URL行为如此奇怪。对于引用,此代码不在任何其他代码块中,而是直接放入视图中。

如何在不需要创建自定义函数或扩展方法的情况下强制剃刀让我执行此任务。

2 个答案:

答案 0 :(得分:2)

使用括号明确表达式是什么,如C# Razor Syntax Quick Reference

中所述
//www.youtube.com/embed/@(Model.MallVideos.Where( mv => mv.IsFeatured).FirstOrDefault().Video.Code)

HTML扩展方法

public static MvcHtmlString FullUrl(this HtmlHelper htmlHelper,
    string baseAddress,
    string relativeUri,
    string innerText = "")
{
    Uri baseUri = new Uri(baseAddress);
    Uri fullUri = new Uri(baseUri, relativeUri);

    var builder = new TagBuilder("a");
    builder.MergeAttribute("href", fullUri.ToString());

    if (string.IsNullOrEmpty(innerText))
    {
        builder.InnerHtml = fullUri.ToString();
    }
    else
    {
        builder.InnerHtml = innerText;
    }

    return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
}

<强> CSHTML

    @Html.FullUrl(
        "http://www.youtube.com/embed/",
        Model.MallVideos.Where( mv => mv.IsFeatured).FirstOrDefault().Video.Code) 

生成的Html

<a href="http://www.youtube.com/embed/12345">http://www.youtube.com/embed/12345</a> 

我试图重现你的问题,当我使用括号时我无法重现它。

模型

namespace Project.Models
{
    public class VideosViewModel
    {
        public List<MallVideo> MallVideos { get; set; }
    }

    public class MallVideo
    {
        public bool IsFeatured { get; set; }
        public Video Video { get; set; }
    }

    public class Video
    {
        public string Code { get; set; }
    }
}

<强>控制器

public class HomeController : Controller
{
    Random rnd = new Random();

    public ActionResult Index()
    {
        var model = new VideosViewModel();
        model.MallVideos = GetVideos(10);

        return View(model);
    }

    public List<MallVideo> GetVideos(int length)
    {
        var videos = new List<MallVideo>();
        for (int i = 0; i < length; i++)
        {
            videos.Add(new MallVideo()
            {
                IsFeatured = (rnd.NextDouble() > 0.5),
                Video = new Video()
                {
                    Code = Path.GetRandomFileName()
                }
            });
        }

        return videos;
    }
}

查看

注意:http://www.youtube.com/embed/@(Model.MallVideos.Where(mv => mv.IsFeatured).FirstOrDefault().Video.Code)

@model Project.Models.VideosViewModel

<fieldset>
    <legend>VideosViewModel</legend>
    <p>
        http://www.youtube.com/embed/@(Model.MallVideos.Where(mv => mv.IsFeatured).FirstOrDefault().Video.Code)
    </p>
    <p>
        @Model.MallVideos.Where(mv => mv.IsFeatured).FirstOrDefault().Video.Code
    </p>
</fieldset>

生成的HTML

<html>
<body>
    <fieldset>
    <legend>VideosViewModel</legend>
    <p>
        http://www.youtube.com/embed/013dq0j5.dr1
    </p>
    <p>
        013dq0j5.dr1
    </p>
</fieldset>
</body>
</html>

答案 1 :(得分:0)

今天我能够做到:

(在将内容分散到嵌入式javascript中的情况下)

var someSortfData = '@Html.Raw(Model.SomeSortOfData)';

如果您落在这里,想知道如何防止输出完全逃脱。