奇怪的过早验证控制

时间:2013-02-04 15:23:23

标签: c# asp.net asp.net-mvc

我正在学习一个新创建的默认简单MVC4 Web项目。

在索引页面中,我有一个链接供用户使用他的帐户登录网站。之后,他将被重定向到一个表格,输入新名称,新密码。

我已准备好使用[Required]验证此表单。但是,当重定向页面被完全加载时,这些控件(用户名和密码)也已经过验证(Field needs be filled in)。

以下是用户使用其帐户

登录后的POST代码
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
    return RedirectToCreateUser(returnUrl);
}

// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);

这是方法RedirectToCreateUser

private ActionResult RedirectToCreateUser(string url)
{
    if (Url.IsLocalUrl(url))
    {
        return Redirect(url);
    }
    else
    {
        return RedirectToAction("CreateNewUser", "Account");
    }
}

最后是用于http GET的CreateNewUser方法

public ActionResult CreateNewUser(CreateNewUserModel model)
{         
    return View(model);
}

另一个用于http POST但我认为尚未访问过。

[HttpPost]
public ActionResult CreateNewUser(CreateNewUserModel model, string url)
{
    if (ModelState.IsValid)
    {
        // Attempt to register the user
        try
        {
            WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
            WebSecurity.Login(model.UserName, model.Password);
            return RedirectToAction("CreateUserSuccess", "Account");
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
        }
    }
    else
    {
    }
    return View(model);
}

2 个答案:

答案 0 :(得分:0)

CreateNewUser操作在[HttpPost]上触发,并尝试使用无效(空)凭据发布。

您需要使用[HttpGet]添加一些效果:

[HttpGet]
public ActionResult CreateNewUser(CreateNewUserModel model)
{         
    return View(model);
}

答案 1 :(得分:0)

你的问题在这里

最后是用于http GET

的CreateNewUser方法
public ActionResult CreateNewUser(CreateNewUserModel model)
{         
    return View(model);
}

您无法将对象作为参数传递给get请求。可能签名应该是

public ActionResult CreateNewUser()
{    
    var model = new CreateNewUserModel();     
    return View(model);
}

或类似的东西