我是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是否为回发?
谢谢!
答案 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)