首页 > 解决方案 > 在 ASP.NET MVC 中提交表单什么都不做

问题描述

我有一个在 ASP.NET MVC 中定义的表单,它在提交时完全没有任何作用。我设置了一个控制器方法来处理它,但由于某种原因,当我提交表单时,该方法永远不会被调用。

该表单是在 C# 代码中使用IHtmlMarkupWriter派生类定义的,例如LayoutRowTextBox

/// <summary>
/// Allows the user to change their password when it is expired.
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult ChangeExpiredPassword()
{
    ActionResult actionResult = null;

    try
    {
        ContentViewModel viewModel = new ContentViewModel();

        Form form = new Form();
        form.Method = FormMethod.Post;
        form.Action = "User/ChangeExpiredPassword";

        ValidationSummary summary = new ValidationSummary();
        form.Add(summary);

        GroupBox container = new GroupBox("Change Expired Password");

        LayoutRow rowOldPassword = new LayoutRow();
        var txtOldPassword = new TextBox();
        txtOldPassword.Type = TextBoxType.Password;
        txtOldPassword.Label = "Old Password";
        txtOldPassword.ID = txtOldPassword.Name = "oldPassword";
        rowOldPassword.Add(txtOldPassword);
        container.Add(rowOldPassword);

        LayoutRow rowNewPassword = new LayoutRow();
        var txtNewPassword = new TextBox();
        txtNewPassword.Type = TextBoxType.Password;
        txtNewPassword.Label = "New Password";
        txtNewPassword.ID = txtOldPassword.Name = "oldPassword";
        rowNewPassword.Add(txtNewPassword);
        container.Add(rowNewPassword);

        LayoutRow rowConfirm = new LayoutRow();
        var txtConfirm = new TextBox();
        txtConfirm.Type = TextBoxType.Password;
        txtConfirm.Label = "Confirm New Password";
        txtConfirm.ID = txtConfirm.Name = "confirm";
        rowConfirm.Add(txtConfirm);
        container.Add(rowConfirm);

        LayoutRow row2 = new LayoutRow();

        SubmitButton submit = new SubmitButton();
        row2.Add(submit);

        ResetButton reset = new ResetButton();
        row2.Add(reset);

        container.Add(row2);

        LayoutRow row3 = new LayoutRow();
        container.Add(row3);
        row3.Add(CreateReturnToLoginControl());

        form.Add(container);

        viewModel.ContentControls.Add(form);

        actionResult = View(viewModel);
    }
    catch (Exception ex)
    {
        HandleException(ex);
        actionResult = Error();
    }

    return actionResult;
}

处理程序的设置如下:

[HttpPost]
[SupportedBehaviors(BehaviorName.ChangeMyPassword)]
public ActionResult ChangeExpiredPassword(ChangeMyPasswordModel model)
{
    ActionResult actionResult = null;
    JsonResponse response = null;

    try
    {
        IBehaviorProvider<IChangeMyPasswordModel> provider = new ChangeMyPasswordBehaviorProvider();
        var result = provider.Handle(model);

        string xml = String.Format("<Data><OldPassword>{0}</OldPassword><NewPassword>{1}</NewPassword></Data>", model.OldPassword, model.NewPassword);
        LogSecurityEvent(SecurityLogType.InvokedChangeMyPassword);

        response = new JsonResponse(result.Successful, result.Message);
    }
    catch (Exception ex)
    {
        response = new JsonResponse(false, ex.Message);
    }

    actionResult = Json(response);

    return actionResult;
}

第一个方法在我导航到ChangeExpiredPassword操作时被调用,但是当我提交表单时,什么也没有发生;不调用第二种方法。这里会发生什么?如何获取要调用的 POST 方法?

标签: c#asp.netasp.net-mvc

解决方案


我需要在我的操作名称前加上一个斜杠:

form.Action = "/User/ChangeExpiredPassword";

不是

form.Action = "User/ChangeExpiredPassword";

推荐阅读