开发者

ASP.NET MVC, email address as parameter breaking routes

开发者 https://www.devze.com 2023-03-29 19:01 出处:网络
I have the following actionresult: public ActionResult Confirmation(string emailAddress) When I try to access it:

I have the following actionresult:

public ActionResult Confirmation(string emailAddress)

When I try to access it:

http://localhost:8080/Signup/Confirmation?emailAddress=test%40test.com

I get this:

The view 'test@test.com' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Signup/test@test.com.cshtml
~/Views/Signup/test@test.com.vbhtml

What gives why isn't it looking for the correct view? If I go to "/SignUp/" it correctly shows me 开发者_StackOverflowthe index, along with the other ActionResults working correctly. Why does an address break it?


You shouldn't be passing that info in the URL anyway.

If this is kind of a "Confirmation" page from a signup, you could pass another identifier, e.g the UserId that has just been created, then fetch it from the repo.

E.g:

[HttpPost]
public ActionResult Signup(SignupViewModel model)
{
   //.. code to save.. etc

   return RedirectToAction("Confirmation", new { id = newUser.UserId });
}

[HttpGet]
public ActionResult Confirmation(int id)
{
   var user = repo.FindById(id);
   // map to model, etc...
   return View(model);
}

So your URL would be (without a specialized route)

http://localhost:8080/Signup/Confirmation?id=123213

Putting user's email addresses in the URL is asking for them to be spammed.


Have you tried registering the route in the global.asax.cs?

Something like:

routes.Add("confirmation", 
    new Route("Signup/Confirmation/{email}", 
    new RouteValueDictionary(new { controller = "Signup", action = "Confirmation", email = UrlParameter.Optional }), 
    new MvcRouteHandler())
);
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号