我刚开始玩ASP MVC,我来自Web Forms的背景。 我已经启动了一个MVC互联网应用程序,想知道一个按钮如何从控制器调用一个动作。在这里,我想使用随MVC Internet应用程序提供的登录示例。
的AccountController:
很多方法
登录视图:
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Log in Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
<li>
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
</li>
</ol>
<input type="submit" value="Log in" />
</fieldset>
所以当我点击视图上的sumbit按钮时,会调用AccountController类中的哪个方法?你是如何解决的?
全部谢谢:)
答案 0 :(得分:1)
当您单击提交按钮时,您发送一个帖子请求,并且在您的AccounController中应该调用此控制器操作:
[HttpPost]
public ActionResult Login(Usermodel model)
{
}
我建议你观看this教程,学习MVC控制器,动作和其他一些东西。这是一个很好的训练。
编辑:在MVC中,当您键入localhost/Home/Index
之类的网址时,它首先会Home Controller
并查找Index action
,并且必须是[HttpGet]操作,因为您的请求是获取的请求。但是您不需要将Action
标记为HttpGet
属性,因为它是默认行为。由于您的RouteConfig
,它的工作方式与此类似。如果查看您的控制器,您的控制器会返回视图HomeController
和AccountController
您将看到返回视图的所有操作,如果您右键单击您的操作并单击转到视图,您将看到属于您的控制器的View
。
答案 1 :(得分:1)
我认为你在谈论默认的ASP.NET MVC模板,在这种情况下你会看到在Login.cshtml
视图中,你在顶部定义了一个模型:
@model MyApp.Models.LoginModel
这会将您的视图绑定到此模型。当您执行POST
时,它将从您的表单中收集名称与模型属性对应的html元素。
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
...
}
这里创建了一个html表单,用于发送/Account/Login
的帖子。但是,您可以指定其他位置:
@using (Html.BeginForm("Index", "Home", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post)) {
...
}
在服务器端,您将期待相同的型号:
public ActionResult Login(LoginModel model, string returnUrl)
{
// awesomeness ...
}
答案 2 :(得分:0)
我刚开始玩ASP MVC,我来自一个 Web表单的背景
使用按钮点击时的ajax帖子与aspx中的相同,url作为动作名称和控制器名称,这是你可以通过webforms获得的最接近的
$.ajax({
url: '@Url.Action("SendMail", "Contact")',
type: 'POST',
data: { listID: selected.toString(), flag: flag },
traditional: true,
success: function (result) {
}
});
或者您可以在MVC中使用默认方式使用整个表单帖子
[HttpPost]
public ActionResult SendMail(Mail model)
{
}
因为你定义了
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
在您的视图上,它将指向通过路径的默认操作,但您可以使用
更改显式定义所需操作名称和控制器名称的默认操作@using (Html.BeginForm("ActionName", "ControllerName", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post)) {