2013-04-12 34 views
3

我有一个三元运营商在我MVC4查看:ASP.NET Razor - 我可以在三元运算符中放置一个链接吗?

@(modelrecord.Website == null ? "" : modelrecord.Website.Replace("http://",""))

这工作,但我想使网站记录的超链接。这可能吗?

注意:我替换了“http://”前缀,因为它很丑。

如果我用Html.Raw放入实际字符串,尖括号会被转义,但我仍然没有链接。

回答

3

你应该使用DataAnnotations@Html.DispayFor帮手。

public class ModelRecord 
{ 
    [DataType(DataType.EmailAddress)] 
    public String EmailAddress { get; set; } 

    [DataType(DataType.Url)] 
    public String Website { get; set; } 
} 

然后:

email me at @Html.DisplayFor(x => x.EmailAddress) 
or visit me online at @Html.DisplayFor(x => x.Website) 

DataTypeAttribute处理之类的网址,电子邮件等,他们根据格式。

如果您想自定义所有的网址,你可以创建一个display template吧:

〜/查看/共享/ DisplayTemplates/Url.cshtml

@model String 
@if (!String.IsNullOrEmpty(Model)) 
{ 
    <a href="@Model">@Model.Replace("http://", "")</a> 
} 
else 
{ 
    @:Default text when url is empty. 
} 

DisplayTemplates(如EditorTemplates)是MVC使用的基于约定的路径。因此,您可以将模板放在Shared目录中,以便在整个站点范围内应用此更改,也可以将该文件夹放在其中一个控制器文件夹中,以使其仅适用于该控制器(例如~/Views/Home/Displaytemplates/Url.cshtml)。另外,Url是预先定义的模板之一包括了使用与DisplayType,具有以下沿着:​​

  • 地址
  • EmailAddress的
  • HiddenInput
  • 的Html
  • 文本
+0

优秀。非常感谢你。我不得不使用@ Html.DisplayFor(x => modelrecord.Website),但是 - 这个答案解释了它:http://stackoverflow.com/questions/10097995/i-want-to-understand-the-lambda-expression -in-html-displayformodelitem-mymo – northben

+0

@northben:确实。我不知道虚拟机的结构,但是展示了如何以最简单的方式格式化值。与你的情况一样,你必须从模型的嵌套对象中引用一个属性(你会看到如何),但前提和装饰是相同的。 –

+0

你确定'x => x.Website'可以用于任何模型吗?我显然是新手,但似乎第一个x'覆盖'这个'无参数'lambda的第二个。 – northben

相关问题