只有带有ActionLink和提交按钮的POST;否则重定向

时间:2014-11-12 21:40:05

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

我正在尝试在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。

1 个答案:

答案 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");
}

无论哪种方式,您都应该使用提交按钮。