ASP.NET MVC - 导航方法

时间:2009-12-07 15:54:35

标签: asp.net-mvc

我是ASP.MVC的新手。我的背景是在ASP.NET Web Forms中,我认为这是导致我混淆的原因。我知道“M”基本上代表数据源,“V”代表我正在请求的资源,“C”代表向最终用户显示的内容。但后来我感到困惑。

例如,我只是想创建一个登录屏幕。我设想用户访问“http://www.myapp.com/Account/Login”,他们将看到一个传统的登录屏幕。为此,我在Global.asax文件的RegisterRoutes方法中添加了以下内容:

routes.MapRoute(
  "Login",
  "{controller}/{action}",
  new { controller = "Account", action = "Login", id = "" }
);

执行Login操作,但这是我感到困惑的地方。你看,第一次加载登录屏幕时,我希望只显示一个用户名/密码字段。然后在帖子上,我希望表格得到验证和处理。为了做到这一点,我创建了以下方法:

public ActionResult Login()
{
  bool isFormValid = ValidateForm();
  if (isFormValid)
    LoginUser();
  else
    ShowErrors();

  return View();
}

我的困惑在于Login操作。最初,没有数据。但下一次,我想验证数据。如何确定Action是否为回发?

谢谢!

2 个答案:

答案 0 :(得分:8)

处理此问题的最简单方法是使用两个操作:一个用于获取,一个用于发布。使用AcceptVerbs属性来控制根据方法调用哪个。顺便说一句,默认路由应该适用于这种情况,因为当提供控制器和操作时,它会按照您的预期进行定向。我认为这个场景也包含在项目模板中 - 您是使用模板还是空模板设置项目?

[AcceptVerbs( HttpVerbs.Get )]
public ActionResult Login()
{
}

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Login( string userName, string password )
{
}

答案 1 :(得分:2)

对于Post和Get,您需要两种不同的方法。

[AcceptVerbs (HttpVerbs.Get]
public ActionResult Login ()
{
    return View ();
}

[AcceptVerbs (HttpVerbs.Post]
public ActionResult Login (FormCollection form)
{
    if (AuthenticationSuccess ())
        return RedirectToAction ("Account");
    else
        return View ();
}

对于Post版本,您可以使用模型绑定机制:

public ActionResult Login (LoginModel loginModel)

或者

public ActionResult Login (string LoginName, string Password)