whoah
whoah

Reputation: 4443

overload views in MVC?

I want to have links http://localhost:2409/Account/Confirmation/16 and that link http://localhost:2409/Account/Confirmation/ (without parametr).
But with this action methods, it isn't working. Why?

    public ActionResult Confirmation(int id, string hash)
    {
         Some code..

        return View();
    }

second, I just want to return View, if parametr is empty.

    public ActionResult Confirmation()
    {

        return View();
    }

Error (translated):

The current request for action on a controller Confirmation AccountController is ambiguous between the following methods of action: System.Web.Mvc.ActionResult Confirmation (Int32, System.String) for type TC.Controllers.AccountController System.Web.Mvc.ActionResult Confirmation () for type TC.Controllers.AccountController

Upvotes: 2

Views: 1646

Answers (2)

Arsman Ahmad
Arsman Ahmad

Reputation: 2211

There is no need to make 2-methods for it. Your HTTP request get confused that which ActionMethod should be called on both cases;

http://localhost:2409/Account/Confirmation/16 
http://localhost:2409/Account/Confirmation/

Instead of all this, just create a single method. Make its parameter optional or assign some default value to the parameters. Here are 2-examples to understand it.

// 1. Default value to paramter
public ActionResult Confirmation(int id = 0, string hash = null)
{
    //Some code..

    return View();
}  

// 2. Make id optional
public ActionResult Confirmation(int? id, string hash)
{
    //Some code..

    return View();
} 

You can adopt any one approach from them.

Upvotes: 0

nemesv
nemesv

Reputation: 139748

You cannot have multiple actions with the same name using the same HTTP verb (in your case GET.) You can name your actions differently but this means the link will change or you can use different VERB but this can also leads to other problems like you cannot just enter the link in your browser.

What you should do is to change your id to be optional with int? and merge your two actions into one:

public ActionResult Confirmation(int? id, string hash)
{
    if(id.HasValue)
    {
        //Some code.. using id.Value

        return View();
    }

    //There was no Id given
    return View();
}

You may also need to allow in your route that the id is optional. If you are using the default routes this should be the default setting:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);

Upvotes: 4

Related Questions