2014-10-20 8 views
0

Я пытаюсь добавить видео-код youtube динамически к ссылке, однако бритва выходит из знака @.Как предотвратить бритву от экранирования

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

это работать, если я пишу это, как вставлять/@model или врезать/@ Модель однако теперь URI нарушается.

Что среднее битого HTML является то, что, когда результат визуализируется в браузере вы увидите:

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

вместо

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

Интересно, когда я использую/@ model в любом другом месте в моих URL-адресах на одном и том же представлении, это работает, только этот конкретный URL-адрес, который действует так странно. для refrence этот код не находится в каком-либо другом блоке кода и его непосредственно помещается в представление.

Как я могу заставить бритву позволить мне выполнить эту задачу без необходимости создания настраиваемой функции или метода расширения.

ответ

1

Используйте круглые скобки, чтобы быть явным о том, что выражение, как описано в 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> 
+0

Это не сработало. Он просто игнорирует его и помещает код в HTML в браузер. Я закончил использование String.concat, чтобы прикрепить результат razore к концу строки, но я все еще надеюсь, что бритва имеет более чистое решение для этого. – Benjishk

+0

Что вы подразумеваете под «кодом как HTML в браузере», можете ли вы вставить пример ожидаемого результата и фактического? Там могут быть лучшие решения на основе того, что вы хотите, например, вы можете решить, что метод расширения будет уместным, я обновил свой ответ с помощью метода расширения. –

+0

Спасибо @DavidMartin, я уточнил вопрос с более подробной информацией. – Benjishk