2014-01-22 36 views
4

我有一些模型,我想呈現的HTML標記在RazorView這樣的:阻止URL沒有協議,成爲相對URL

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

用戶可以寫在Website性質(任何URL google.comwww.google.comhttp://www.google.com等)。

的問題是,如果用戶doen't寫協議前綴,像http,然後將得到的HTML被看作是由瀏覽器中的網站相對URL:

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

是否有任何簡單的解決方案或在呈現html之前是否必須準備網站字符串(添加「http」前綴)?

+1

夥計們,這個問題與MVC或Razor無關,它[當然不是ASP.NET MVC 3的特定](http://meta.stackexchange.com/questions/85358/what-are-the -guidelines-使用版本特定的標籤換)。請停止添加這些標籤。 – CodeCaster

回答

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/

+0

所以我不能簡單地強迫剃刀直接呈現這個字符串,而不將其映射到動作方法? – user3172616

+1

對於Razor,你的'Model.Website'是一個像其他任何字符串一樣的字符串。它不會神奇地在它前面添加'http'(爲什麼不是'https?'),因爲它恰好被打印在'a'標籤的'href'屬性中。您的瀏覽器會將'轉換爲'(在瀏覽器中單擊_View Source_,而不是檢查DOM以驗證這一點)。請在保存網址之前使用我的代碼修復它,或者參閱@ hutchnoid的答案以防止首先輸入無效的URL。 – CodeCaster

+1

ty解釋! – user3172616

2

您可以使用[Url]屬性來強制用戶輸入正確的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")]