Asp.net mvc MVC传统表单操作不调用控制器方法

Asp.net mvc MVC传统表单操作不调用控制器方法,asp.net-mvc,forms,actionresult,Asp.net Mvc,Forms,Actionresult,我知道这个话题已经引起了很多开发者的兴趣,也在很多论坛上被讨论过,但是我还没有找到解决我问题的正确答案。也许我还没有尽力去寻找答案,在这种情况下,如果各位开发人员能告诉我任何有用的论坛,那就太好了 我遇到的问题只是传统的HTML操作没有调用controller ActionResult方法 我有一个名为“_Form.cshtml”的局部视图,如下所示: 这是我的ActionResult“Temp_Form”,它位于“ProductController.cs”中: 我使用的是“@Url.Acti

我知道这个话题已经引起了很多开发者的兴趣,也在很多论坛上被讨论过,但是我还没有找到解决我问题的正确答案。也许我还没有尽力去寻找答案,在这种情况下,如果各位开发人员能告诉我任何有用的论坛,那就太好了

我遇到的问题只是传统的HTML操作没有调用controller ActionResult方法

我有一个名为“_Form.cshtml”的局部视图,如下所示:

这是我的ActionResult“Temp_Form”,它位于“ProductController.cs”中:

我使用的是“@Url.Action(“ActionMethod”、“Controller”)”e.Click(“submit”)作为提交按钮

**出于某种原因,我没有使用Html.BeginForm()调用控制器方法。因此,我的选择是使用传统的表单,使用submit按钮将数据从视图传递到控制器

我也试过

<form action="myController/myAction" method="POST">

上面的格式,但我的ActionResult仍然没有调用

我不认为我的主要观点会导致ActionResult不启动,因为它只有两个级联的下拉列表,可以在客户端选择正确的表单


有人能指出我做错了什么,或者给我一些建议吗?正如我前面提到的,我不会仅仅因为我有那些Telerik Kendo验证似乎只使用传统的表单就使用Html.BeginForm()


非常感谢!

问题是您正在使用JavaScript事件处理表单的提交

因此,如果您想为submit按钮保留JS事件,则需要使用JS方法中的Ajax调用来发布操作,如:

$.ajax({
    url: '/Product/Temp_Form',
    data: $('#tempForm').serialize(),
    type: 'POST',
});

您使用的是Razor语法,因此不要直接使用表单标记,请使用
Html.BeginForm()
,如下所示

@using(Html.BeginForm("Temp_Form", "Product", FormMethod.Post, new {@class = "k-content", @id="tempForm" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    <fieldset>
        //your HTML here
    </fieldset>
}
@使用(Html.BeginForm(“Temp_Form”、“Product”、FormMethod.Post、new{@class=“k-content”、@id=“tempForm”}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
//你的HTML在这里
}

如果可能的话,也可以使用强类型模型,而不是像ddlBrand和tbRange这样的松散字符串属性。

为什么不使用
Html.BeginForm()
?为什么在表单标记之外有
@Html.AntiForgeryToken()
?你的
函数submit(e){
中的代码是什么只是因为我有那些Telerik Kendo验证,它们似乎只适用于传统的表单……”由于某些原因,如果我更改为Html.BeginForm(),验证消息不会出现。我取消了提交(e)只是因为我认为它与本主题无关,因为它只处理隐藏和显示div。不熟悉剑道验证,但可能是因为
@Html.BeginForm()
将添加
novalidate=“novalidate”
(但您可以同样轻松地使用
@Html.BeginForm())
并将
novalidate
属性设置为空字符串。但是这与您的问题无关,因为
action=“@Url.action”(“Temp_Form”,“Product”)”
将生成正确的Url。您可以通过注释
@(Html.Kendo().Button()来轻松测试这一点…
并替换为
,然后将其发布到您的方法中。在这种情况下,您的
Temp_Form()
方法是否用
[ValidateAntiForgeryToken]
属性修饰?(如果没有,则不会命中该方法)健全性检查:(a)如果您没有在JS中处理提交事件,会发生什么?(b)使用您的浏览器工具进行检查,并查看请求/响应流量(甚至脚本错误,如果您有js在管道中)。因此,我最终使用了your way@Aram,一切都按照我希望的系统执行。谢谢您的建议!
<form action="myController/myAction" method="POST">
$.ajax({
    url: '/Product/Temp_Form',
    data: $('#tempForm').serialize(),
    type: 'POST',
});
@using(Html.BeginForm("Temp_Form", "Product", FormMethod.Post, new {@class = "k-content", @id="tempForm" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    <fieldset>
        //your HTML here
    </fieldset>
}