防止没有协议的URL成为相对URL

时间:2014-01-22 11:44:27

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我有一些模型,我想在RazorView中渲染html-markup,如下所示:

<a href="@Model.Website">@Model.Title</a>

用户可以在Website属性(google.comwww.google.comhttp://www.google.com等)中写入任何网址。

问题是,如果用户没有编写协议前缀,例如http,那么生成的HTML将被浏览器视为站点相对URL:

<a href="http://localhost:xxxx/google.com">Google</a>

有没有简单的解决方案,还是我必须在渲染html之前准备网站字符串(添加“http”前缀)?

2 个答案:

答案 0 :(得分:5)

这不是特定于MVC的,但您可以使用UriBuilder类:

string uri = "http://msdn.microsoft.com/en-us/library/system.uribuilder.aspx";
var uriBuilder = new UriBuilder(uri);
uriBuilder.Scheme = "http";
Console.WriteLine(uriBuilder.Uri);

打印http://msdn.microsoft.com/en-us/library/system.uribuilder.aspx

string uri = "google.com";
var uriBuilder = new UriBuilder(uri);
uriBuilder.Scheme = "http";
Console.WriteLine(uriBuilder.Uri);

打印http://google.com/

答案 1 :(得分:2)

您可以使用[Url]属性强制用户输入正确的网址。

将此添加到您的模型中:

[Url]
public string Website { get; set; }

这是你的观点。

 <div class="editor-field">
        @Html.EditorFor(model => model.Website)
        @Html.ValidationMessageFor(model => model.Website)
 </div>

您可以像这样向用户指定特定的消息:

[Url(ErrorMessage = "You must specify the full url including the protocol i.e. http://www.google.com")]