我创建了一个用作局部视图的表单。
我在“保存”操作中放置了一个断点,当我单击提交按钮时,它会验证数据,但从未到达操作,而是多次达到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。
答案 0 :(得分:2)
我在RouteConfig.cs
文件中发现了问题。
错误的映射会混淆路由,我猜它会将Index
操作用作默认操作,而不是由于设置错误而找不到的特定操作。
答案 1 :(得分:0)
尝试在Action
方法中指定Controller
和BeginForm
:
Html.BeginForm("Save", "YourController", FormMethod.Post)
答案 2 :(得分:0)
您使用不引人注目的验证吗?如果是这样,验证正在客户端进行,假设您的模型指定标题是必需的,根据您的代码看起来可能。
如果您希望无论验证状态如何都要调用您的操作,您将需要在操作中进行验证,而不是通过不显眼的客户端验证。
答案 3 :(得分:0)
我认为这是由于ValidateAntiForgeryToken可能是你的动作方法没有映射你的表单请求删除这个标签或根据本教程中的给出这样做:
也看到了这个:
答案 4 :(得分:0)
如果[Authorize]
标记位于控制器的顶部,也会发生错误。如果用户未登录,则不会加载未标记为[AllowAnonymous]
的操作。