Khoa Tran
Khoa Tran

Reputation: 131

Why Http Get action is called instead of Http post action?

I'm working with MVC and spent whole day getting stuck with this problem. Here is code at the controller:

public class CMController : Controller
{   
    public ActionResult SignUp()
    {
        return View("SignUpPage");
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SignUp(User u)
    {
        if (ModelState.IsValid)
        {
            using (CmdbEntities dc = new CmdbEntities())
            {
                dc.Users.Add(u);
                dc.SaveChanges();
                ModelState.Clear();
                u = null;
                ViewBag.Message = ("Successfully sign on");
            }
        }
        else
        {
            ViewBag.Message = ("Error");
        }
        return View("Welcome");
    }

}

Here is the SignUpPage.cshtml view:

@using (Html.BeginForm("SignUp", "CM", FormMethod.Post))
    {  
        @Html.AntiForgeryToken()
        <div class="form-group" style="padding:5px 50px">
            <label> First name:</label>
            <div>
                @Html.TextBoxFor(model => model.FirstName, new {@class="form-control", placeholder="Enter first name", ID="FirstName"})
            </div>
        </div>
        <div class="form-group" style="padding:5px 50px">
            <label >Last name:</label>
            <div>
                @Html.TextBoxFor(model => model.LastName, new {@class="form-control", placeholder="Enter first name", ID="LastName"})
            </div>
        </div>
        <div class="form-group"  style="padding:5px 50px">
            <label for="email">Email:</label>
            <div>
                @Html.TextBoxFor(model => model.Email, new {@class="form-control", placeholder="Enter email", ID="Email", type="email"})
            </div>
        </div>
        <div class="form-group"  style="padding:5px 50px">
            <label >User name:</label>
            <div>
                @Html.TextBoxFor(model => model.UserName, new {@class="form-control", placeholder="Enter user name", ID="UserName"})
            </div>

        </div>
        <div class="form-group"  style="padding:5px 50px">
            <label for="pwd">Password:</label>
            <div>
                @Html.TextBoxFor(model => model.Password, new {@class="form-control", placeholder="Enter password", ID="Password", type="password"})
            </div>
        </div>
        <div class="form-group"  style="padding:5px 50px">
            <label for="pwd">Confirm password:</label>
            <div>
                @Html.TextBoxFor(model => model.ConfirmPassword, new {@class="form-control", placeholder="Re-enter password", ID="_password", type="password"})
            </div>
        </div>
        <div class="form-group"  style="padding:5px 50px">
            <div>
                <input type="submit" ID="SignUp" class="btn btn-success" value="Sign Up" />
            </div>
        </div>
    }

The problem is, when load page first time, the action SignUp() is called which is correct. But when submit the form, SignUp() is called again instead of the post action SignUp(User u).

One more problem, even the form has post method, when click submit the url contains input information just like get method, I don't understand.

Here is the page html source of form tag.

<form action="/CM/SignUp" method="post"><input name="__RequestVerificationToken" type="hidden" value="VJ0YcQr1Z-l3Qo717pRpZNT-QtL59G2EJXy2JQL8NFnOm-XoNnAD-8T-Itz3i1EboGj0bhpBf2G26ifxm4F5ZRyKimkOyZW1AxZ3ckPNuRk1" />

Please help, thank you.

Upvotes: 2

Views: 1236

Answers (1)

BGStack
BGStack

Reputation: 1144

Can you please try adding [AllowAnonymous]

to the post method?

Did you activate global authorization anywhere System.Web.Mvc.AuthorizeAttribute ?

Upvotes: 1

Related Questions