Why is Model Binding not working in my POST action method?

I have a really wierd issue with MVC. My models keeps getting submitted empty. And it's probably really simple, but I just can't find the issue.

My model looks like this:

public class LoginModel
{
   public string Username;
   public string Password;
}

My controller like this:

[HttpGet]
public ActionResult Login()
{
     return View();
}

[HttpPost]
public ActionResult Login(LoginModel loginTest)
{
      if (loginTest.Username != "x" && loginTest.Password != "y")
      {
           ModelState.AddModelError("a", "Login failed.");
           return View(loginTest);
      }
      else
      {
         return RedirectToAction("Home", "Welcome");
       }

}

And the view is also very simple, like this.

@model LoginSolution.Models.LoginModel
@{
   Layout = null;
}
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Login</title>
    </head>
    <body>
        @using (Html.BeginForm("Login", "Home")) 
        { 
        <div> <span>Username : </span>
            @Html.EditorFor(model => model.Username)
        <br />
            <span>Password : </span>
            @Html.EditorFor(model => model.Password)
        <br />
        @Html.ValidationSummary()
        <br />
        <input type="submit" value="Login" name="Login" />
        </div>
        }
    </body>
    </html>

This is not a question about security or best practice. This is just a question regarding why the model keeps returning itself as empty upon submitting.


Your model contains fields, not properties (no getter/setter) so the model binder cannot set the values. Change your model to

public class LoginModel
{
   public string Username { get; set; }
   public string Password { get; set; }
}