MVC传统表单操作不调用控制器方法

时间:2015-06-12 00:42:53

标签: asp.net-mvc forms actionresult

我知道这个主题已经引起了很多开发人员的兴趣,并且已经在许多论坛中被讨论过了,但是我找不到能够解决我的问题的正确答案。也许我没有努力寻求答案,在这种情况下,如果你的开发人员可以让我知道任何有用的论坛,那就太好了。

我遇到的问题只是传统的HTML动作没有调用控制器ActionResult方法。

我有一个名为“_Form.cshtml”的部分视图如下:

< _Form.cshtml>

<form action="@Url.Action("Temp_Form", "Product")" method="post" class="k-content" id="tempForm">
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    <fieldset>
    <p class="lead">Please fill in the following form.</p>
    <br />

    <div class="form-horizontal">
        <div class="form-group">
            @Html.Label("Brand", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @(Html.Kendo().DropDownList()
                .Name("ddlBrand")
                .OptionLabel("--- Select ---")
                .HtmlAttributes(new { id = "brand", required = "required", data_required_msg = "Select Brand", @class = "form-control" })
                .DataTextField("Name")
                .DataValueField("Id")
                .BindTo(Products.ProductBrandCollection.LoadAll())
                )
                <span class="k-invalid-msg" data-for="ddlBrand"></span>
            </div>
        </div>
        <div class="form-group">
            @Html.Label("Range", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @(Html.Kendo().TextBox()
                .Name("tbRange")
                .HtmlAttributes(new { required = "required", validationmessage = "Enter Range" })
                )
                <span class="k-invalid-msg" data-for="tbRange"></span>
            </div>
        </div>
    </div>

    <div id="buttondiv">
        <div class="column">
            <div class="vis" id="submitbutton">
                @(Html.Kendo().Button()
                .Name("btnSubmit")
                .HtmlAttributes(new { type = "submit", @class = "button-next" })
                .Icon("arrowhead-e")
                .Content("SUBMIT")
                .Events(e => e.Click("submit"))
                )
            </div>
        </div>
    </div>
    </fieldset>
</form>

在主视图“Product.cshtml”中,我有以下用于提交按钮的javascript点击事件:

function submit(e) {
    // handles hiding and showing divs
}

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

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Temp_Form(string ddlBrand, string tbRange)
{
    TempData["brand"] = ddlBrand;
    TempData["range"] = tbRange;
    return Content("");
}

我猜它是“@ Url.Action(”ActionMethod“,”Controller“)”&lt; - 此部分格式不正确或同时具有“type =”submit“和”.Events(e =&gt; ; e。点击(“提交”))“按提交按钮。

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

我也试过..

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

以上格式但我的ActionResult仍未调用。

我不认为我的主视图导致ActionResult不会触发,因为它只有两个级联DropDownLists,可以在客户端选择正确的表单。

有人可以确定我做错了什么或建议替代方案吗?正如我上面提到的,我没有任何机会使用Html.BeginForm()只是因为我有那些似乎只使用传统形式的Telerik Kendo验证..

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

问题是您正在处理带有JavaScript事件的表单提交......

因此,如果你想保留你的提交按钮的JS事件,你需要使用JS方法的Ajax调用来执行POST操作,例如:

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

答案 1 :(得分:0)

您使用的是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>
}

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