【问题标题】:ASP.NET MVC form submits to index instead to submitting to the right actionASP.NET MVC 表单提交到索引而不是提交到正确的操作
【发布时间】:2013-04-24 13:43:20
【问题描述】:

我创建了一个用作局部视图的表单。

我在“保存”操作处放置了一个断点,当我单击提交按钮时,它会验证数据,但从未到达该操作,而是多次到达Index 操作!

代码如下:

@model Models.Category

@using (Html.BeginForm("Save", "Categories", FormMethod.Post))
{
  @Html.AntiForgeryToken()

  <fieldset>
    <legend>Category</legend>

    @Html.HiddenFor(model => model.CategoryId)

    <p>@((Model.CategoryId > 0 ? "Edit" : "New") + " category")</p>

    <div class="editor-label">
      @Html.LabelFor(model => Model.Title)
    </div>
    <div class="editor-field">
      @Html.EditorFor(model => Model.Title)
      @Html.ValidationMessageFor(model => Model.Title)
    </div>

    <div class="editor-label">
      @Html.LabelFor(model => Model.Description)
    </div>
    <div class="editor-field">
      @Html.EditorFor(model => Model.Description)
      @Html.ValidationMessageFor(model => Model.Description)
    </div>

    <p>
      <input type="submit" value="Save">
      @Html.ValidationSummary(true)
    </p>
  </fieldset>
}

行动:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(Category category)
{
  throw new Exception("Exception has been thrown!");
}

这是我点击“保存”时发生的屏幕截图,显示验证错误,但未调用 Save 操作,也未引发异常。
而是触发了Index 操作!

我还可以检查什么来追踪问题?谁将页面重定向到索引???

可以看到输出 HTML here

【问题讨论】:

  • 奇怪,你的控制器肯定叫Categories 是吗?当它通过验证时,它是否仍然提交给Index
  • @Shinny 你能发布打开form标签的输出HTML(来自浏览器的开发工具)吗?
  • @mattytommo jsfiddle.net/gRjeT
  • 看起来不错,在您的保存方法中有重定向到索引吗?能否贴出Save方法的代码(实际正文)
  • 会不会是您的身份验证 cookie 已过期,因此它正在重定向到您的主页索引页面?

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


【解决方案1】:

我在RouteConfig.cs 文件中发现了问题。

有一个错误的映射混淆了路由,我猜它使用Index作为默认操作,而不是由于设置错误而找不到的特定操作。

【讨论】:

    【解决方案2】:

    尝试在BeginForm 方法中指定ActionController

    Html.BeginForm("Save", "YourController", FormMethod.Post) 
    

    【讨论】:

    • 这不是问题,很抱歉在我的帖子中省略了BeginForm 参数,它现在在那里,请更新或删除您的答案。
    【解决方案3】:

    您是否使用不显眼的验证?如果是这样,验证发生在客户端,假设您的模型指定 Title 是必需的,根据您的代码看起来很可能。

    如果您希望无论验证状态如何都调用您的操作,您需要在您的操作中进行验证,而不是通过不显眼的客户端验证。

    【讨论】:

    • 我禁用了验证,但没有帮助。
    【解决方案4】:

    我认为这是由于 ValidateAntiForgeryToken 可能是您的操作方法未与您的表单请求映射删除此标签或根据本教程中的内容执行此操作:

    还可以看到:

    【讨论】:

    • 我将它从视图和动作中删除,保存按钮运行Index动作。
    • 请注意,如果您想使用 Save 操作,则应将其放在您的代码中:Html.BeginForm("Save", "Categories", FormMethod.Post)
    • 如你所见,它在我的表单中。
    【解决方案5】:

    如果[Authorize] 标签位于控制器的顶部,也可能会发生此错误。如果用户未登录,则不会加载未标记[AllowAnonymous] 的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多