我正在尝试动态添加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行为如此奇怪。对于引用,此代码不在任何其他代码块中,而是直接放入视图中。
如何在不需要创建自定义函数或扩展方法的情况下强制剃刀让我执行此任务。
答案 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)';
如果您落在这里,想知道如何防止输出完全逃脱。