我正在尝试在MVC5中设置一个简单的表单提交,但我发现我的方法不会被解雇,除非我 ActionLink
和{{1 }}按钮。
我有一个简单的模型:
submit
然后我的控制器中有两个方法,一个用于表单提交,一个用于表单提交:
public class LoginModel
{
public string username { get; set; }
}
最后,我的View创建了一个POST表单:
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel myModel)
{
var username = myModel.username;
// do something with username
return View();
}
我真的不在乎我是否使用@using (Html.BeginForm("Login", "Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.TextBox("username", string.Empty)
@Html.ActionLink("Enter", "Login")
<input type="submit" name="submit" value="Enter" />
}
或者我是否有提交按钮(MSDN implies它应该是后者),但如果我只有其中一个,我的{{ 1}}方法未被调用,我的页面被重定向到查询字符串中的用户名:
ActionLink
如果我在页面上同时有两个,我可以单击[HttpPost]
,我看到使用包含我提供的值的/Home/Login?ReturnUrl=%2F%3Fusername%3DmyUsernameHere
调用适当的方法。但是,ActionLink
按钮仍会重定向。
我希望这个表单方法是POST,而不是GET(它在生成的HTML中),以及未将密钥作为GET参数包含的失败。只有一个这些表单提交机制有什么问题?为什么他们不按预期触发POST?即使在我的变通方案中正确提交了模型,我还需要做些什么才能在视图中“注册”我的模型吗?
编辑 - 我配置的路线通常如下:
myModel.username
通常情况下,我会转到submit
而不是routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.RouteExistingFiles = true;
。
另外,我确实有一些身份验证设置,我的HomeController用/Login
装饰,我的登录方法都用/Home/Login
。删除所有注释后,我仍然发现我的[Authorize]
未被调用,[AllowAnonymous]
显示为GET参数而不是POST。
答案 0 :(得分:0)
我相信该应用程序并不了解您正在尝试使用用户名制作模型。因此,您正在发送字符串用户名并尝试将其放入模型中。我对此并不完全确定。您可以尝试将表单绑定到您的模型吗?这是一个例子:
查看:
@model YourApplication.Models.LoginModel
@using (Html.BeginForm("Login", "Home"))
{
@Html.AntiForgeryToken()
@Html.TextBoxFor(model => model.username, string.Empty)
<input type="submit" value="Enter" />
}
控制器:
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login([Bind(Include="username")] LoginModel myModel)
{
var username = myModel.username;
// do something with username
return View("Congrats");
}
这是另一种选择。如果你想做其他事情,也许尝试接受字符串“username”并在之后创建你的模型?示例:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(string username)
{
LoginModel myModel = new LoginModel();
myModel.username = username;
// do something with username
return View("Congrats");
}
无论哪种方式,您都应该使用提交按钮。