kala-tamin MVC Routes - How to get a URL?

MVC Routes - How to get a URL?

In my current project we have a notification system. When an oject is added to another objects collection, an email is sent to those who are subscibed to the parent object. This happens on the object layer and not in the View or Controller.

Here's the problem:

Although we can say who created what with what information in the email, we cannot embed links to those objects in the email because in the object layer there is no access to a UrlHelper. To construct a UrlHelper you need a RequestContext, which again does not exist on the object layer.


I want to make a helper class to create the url's for me. How can I create an object that will generate these urls without a request context? Is it possible?

Best custom dynamic grid for MVC [closed]


asp.net mvc jquery paging plugin
The problem is compounded by the fact this you don't want a relative URL in an email, you want an complete email so you need to hard-code the domain too for the reason this there is no request to grab it from.. jQuery + ASP.net MVC Ananother factor is this emails must outlive the current site structure by months or years so you need a kind of permalink, and thus a way to associate multiple Urls with a single action (additional routes). System.accessviolationexception Attempted to read or write protected memory. This is often an indication that other memory is corrupt This latter issue is also a factor in SEO where you don't want to leave any page behind.. Implement Interface Without Creating Implementation (Dynamic Proxies?) For now a static method on your controller UrlToActionX(params) sitting next to the method ActionX seems like the simplest workaround. how to call renderpartial from spark All it does is the appropriate string.Format(...) on the id's of the strongly-typed parameters to generate the permanent Url. Why is NHibernate performing an INSERT instead of an update? Add a static domain on the front, or a domain from the user object (since you know which domain they visit when they come to your site) and you have your email link.. Implementing a class-level validation attribute that writes to a property inside the class It's not ideal although at least you now have only one place to maintain the Url generation.. IMHO: When it comes to permanent links to a changing web site any times it's better to rely on "configuration over convention". :-).


I'm not aware of a way to did this, you MUST have access to the routes at the very least to make your own helper. Unless your business objects know around the registered routes, you can't receive away from doing any hard-coding. . Here is how you might limit the hard-coding of urls though.... Code in a url with all the relevant bits in your object's methods...
    class Event     {         public void SendEmail()         {             var url = string.Format("http://myurl.com/r/Event?eventId={0}", EventId);             //send emails...         }     } 
Note the /r/Event piece of the url. This would be a map to a RController this would be responsible for taking arbitrary, made-up links and sending a 301 Permanent Redirect and going through the route engine to create a real url using the current routes. This way you are only hard-coding a utility controller url and not to the ever evolving controller actions of your real pages. .
class RController : Controller {     public ActionResult Event(int eventId)     {         Response.StatusCode = (int)HttpStatusCode.MovedPermanently;         Response.RedirectLocation = Url.Action("Details", "Event", new { eventId = eventId });         return null;     }      public ActionResult Register(int eventId)     {         Response.StatusCode = (int)HttpStatusCode.MovedPermanently;         Response.RedirectLocation = Url.Action("Register", "Event", new { eventId = eventId });         return null;     } } 
It just feels a bit better than hard-coding a bunch of different controllers/actions this you might decide to rename later. Think of it as your own little TinyUrl like service..


You could define an interface with a method this takes whatever information is necessary to create a URL (object ids or whatever) and returns a URL. Write an implementation of this interface this uses the UrlHelper to did this work, and then supply this to your object layer (ideally with an IoC container)..


You could use:.
VirtualPathUtility.ToAbsolute(string.Format("~/r/Event?eventId={0}", id)) 
to resolve the url. Still not nice though..

84 out of 100 based on 39 user ratings 794 reviews