【发布时间】:2020-03-18 18:27:03
【问题描述】:
我在 ASP.NET MVC 中定义了一个表单,它在提交时完全没有任何作用。我设置了一个控制器方法来处理它,但由于某种原因,当我提交表单时,该方法永远不会被调用。
表单是在 C# 代码中使用 IHtmlMarkupWriter 派生类定义的,例如 LayoutRow 和 TextBox:
/// <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 方法?
【问题讨论】:
-
你是如何渲染表单的?请包含您的视图文件。
-
你能比“什么都不做”更具体吗?原始页面只是停留在那里,还是发生了其他事情?您是否使用 Fiddler 之类的工具查看过电线上发生的情况?您是否使用 Fiddler 或其他工具看到 POST 发生?如果您使用 Postman 之类的工具手动执行 POST,会发生什么情况吗?
标签: c# asp.net asp.net-mvc