通过jQuery使用ASP.NET MVC提交表单并接收值

时间:2015-08-11 20:58:25

标签: jquery asp.net-mvc kendo-asp.net-mvc

我正在开发一个ASP.NET MVC项目,在提交表单时,模型会在数据库中创建一条新记录并将记录ID发送回表单(然后在某些表单中对其进行操作)其他JavaScript代码)。

我使用Telerik Kendo窗口控件,因此想法是用户点击Kendo弹出窗口中的提交按钮,并设置动态链。收到该值后,将关闭Kendo弹出窗口。

我一直在关注此帖子中的示例:PartialView with a form in a kendo window

就提交表单而言,此行为正常。此代码不从控制器接收任何值。在视图中:

<input type="button" value="Create" class="btn btn-default" onclick="formSubmit()"/>

后来......

<script>
    function formSubmit() {
    if (!inIframe()) {
        // We are a parent window
        $('form').submit();
    }
    else {
        // We are a pop-up window
        $('form').submit();
        parent.$('#window').data('kendoWindow').close();
    }
    }
</script>

@(Html.Kendo().Window()
    .Name("window")
    .Title("Attached Report")
    .Content("Loading...")
    .Actions(actions => actions.Close())
    .Iframe(true)
    .Height(700)
    .Width(1000)
    .Modal(true)
    .AutoFocus(true)
    .Visible(false)
)

在控制器中:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(VMMyViewModel viewModel)
{
    // Code omitted...basically, we save to the database
    db.SaveChanges();

    if (viewModel.IsInPopupWindow)
    {
     return null; // We return null to help us exit out of the popup window.
    }
    else
    {
    return RedirectToAction("Index"); // Since we're in the main window, go back to the index after submitting.
    }
}

我想获取刚刚保存到数据库中的记录的记录ID,并以某种方式将其反馈给jQuery调用代码。我能够在控制器中发回记录ID的实际值,但它将作为具有记录ID的网页返回...

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(VMMyViewModel viewModel)
{
    // Code omitted...basically, we save stuff
    db.SaveChanges();

    if (viewModel.IsInPopupWindow)
    {
            return Content(reportHeader.Id.ToString());
    }
    else
    {
    return RedirectToAction("Index"); // Since we're in the main window, go back to the index after submitting.
    }
}

在jQuery方面,似乎我不应该使用$(&#39; form&#39;)。submit()因为没有通过成功获取数据的方式/错误机制。我已经尝试了其他几种方法(viewbags,jQuery触发器,jQuery POST,Kendo窗口控件上的关闭机制),但到目前为止我还没能将所有部分放在一起。

我怀疑我是以完全错误的方式解决这个问题。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

在你的控制器中返回Json而不是Content,以便:

if (viewModel.IsInPopupWindow)
{
        return Json(reportHeader.Id.ToString());
}

然后在你的js中,使用$ .post这样

function formSubmit() {
    if (!inIframe()) {
        // We are a parent window
        // $('form').submit();
    $.post($('form').attr("action"), $("form").serialize(), function(id){
    // you got the id

   // rest omitted ...
})

基本上你使用jquery发布表单,这样你就可以得到post的结果。但是,当你没有返回id时,你必须要做到这一点(在你当前的代码中有一个可能的重定向,哪些不起作用) - 也许返回一些表明存在问题的东西