I’m using ASP.NET MVC 3 and the helper @Html.Raw in my view.
I’m passing it some HTML markup that I have stored in a database. The markup contains some URLs that point to other places on my site. For example http://www.foo.fom/events. These data are forum posts, so the page they’re displayed on has the form http://www.foo.com/forums/thread/42/slug.
However, when the page is rendered, the saved URLs are rendered in modified form as:
http://www.foo.com/forums/thread/42/events/
This only happens for URLs on my site. If the URL points to some external site, it is unchanged.
I have verified that what I’m passing into @Html.Raw is the correct URL (http://www.foo.com/events). Why is it getting changed as the page is rendered? Is there an easy way to disable this “feature”?
Here’s my code for displaying the markup:
<div>
@Html.Raw(post.Body)
</div>
and here’s the controller code that genrates the page data:
var post = _forumRepository.GetPostById(id)
var model = new ForumPostView()
{
Body = post.Body,
PostDate = post.DatePosted,
PostedBy = post.Author,
PostId = post.Id
};
return View(model);
I have verified via debugger that the exact URL in the post.Body before being passed back to the View is of the form “http://www.foo.com/events” (no trailing slash). I have also verified via debugger that the value is unchanged before it is passed into @Html.Raw.
It sounds like the urls that are pointing to other pages on your site are non-absolute. Are you certain they start with a
/orhttp? If not, it’s behaving exactly as it’s supposed and treating them like relative urls — and thus appending them to the current url.(
Html.Rawwill not manipulate the string, so it’s not at fault here)Also, it wouldn’t hurt to show us your code.