34

我对这一切都很陌生。我正在使用 ASP.NET MVC C# LINQ to SQL

我有一个加载作者及其所有书籍的编辑页面。这些书籍是通过Ajax调用加载的。

    <script type="text/javascript">
        $(document).ready(function() {
            LoadBooks();
        });

        function LoadBooks() {
          $(".Books").hide();
          $(".Books").load("/Books/Edit/<%= Model.AuthorID %>");
          $(".Books").show('slow');
        }
     </script>

这部分工作正常。页面加载作者信息,然后加载图书(DIV id="Books" 中的部分视图,仅包含图书类别和图书标题):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Solution.Controllers.BooksController+BooksViewModel>" %>
     <% using (Html.BeginForm(null,null, FormMethod.Post,new { id = "bookform" }))
        {%>
            <fieldset>
                <legend>Books</legend>
                <%int i = 0;
                    foreach (var book in Model.Books)
                    {%>
                      <%= book.BookID%>
                      <%= Html.Hidden("book[" + i + "].BookID", book.BookID) %>

                      <%= Html.DropDownList("book[" + i + "].CatID", new SelectList(Model.Categories, "CatID", "CatTitle", book.CatID))%>
                      <%= Html.ValidationMessage("CatID", "*")%>

                      <%= Html.TextBox("book[" + i + "].BookTitle", book.BookTitle)%>
                      <%= Html.ValidationMessage("BookTitle", "*")%>
                      <br />
                      <%i++;
                    } %>
            </fieldset>
     <% } %>

现在,在主视图页面上,我想要一个链接。单击链接时,我想通过 JavaScript/jQuery/Ajax/whatever 做一些事情。我想要发生的第一件事是从局部视图提交 Books 表单(id = booksform),然后继续执行下一个jQuery函数。因此,我单击了一个调用 JavaScript 函数的链接。这个函数应该调用/执行/执行 Books 表单的提交。

我觉得我已经尝试了所有方法,但是如果没有进行整页提交/刷新,我就无法提交和处理我的 Books 表单。(注意,当完整提交确实发生时,我期望控制器中的操作会成功处理)。我希望控制器进程/操作只返回某种成功/失败指示。(然后我可以再次调用“LoadBooks();”来刷新页面上的 DIV。

有任何想法吗?

4

5 回答 5

66

这就是我使用 jquery 的方式:

function DoAjaxPostAndMore(btnClicked)
{
       var $form = $(btnClicked).parents('form');

        $.ajax({
            type: "POST",
            url: $form.attr('action'),
            data: $form.serialize(),
            error: function(xhr, status, error) {
                  //do something about the error
             },
            success: function(response) {
                 //do something with response
                LoadBooks();

            }
        });

  return false;// if it's a link to prevent post

}

我假设 btnClicked 在表单内:

<input type="button" value="Submit" onclick="DoAjaxPostAndMore(this)"/>

如果链接:

  <a href="/url/something" onclick="return DoAjaxPostAndMore(this)">linktext</a>

如果链接不在表单内部,您只需使用 jquery 选择器即可找到它。您可以将 id 设置为表单,然后找到这样的表单:

var $form = $("#theformid");
于 2009-11-12T09:15:27.150 回答
3

Ajax.BeginForm是你需要使用的,不是Html.BeginForm吗?

于 2009-11-12T13:06:37.240 回答
1
<a href = "javascript: SaveProperties();">Save properties</a>
SaveProperties() { $('#bevpropform').submit(); }

正如我之前所说,应该是

SaveProperties() { $('#bevpropform').submit(); return false; }
于 2009-11-12T22:30:47.147 回答
1

您的“onclick”JavaScript 函数是否执行,问题是整页提交/刷新也会发生吗?在这种情况下,问题在于您没有以return false.

还是根本没有调用您的“onclick” JavaScript 函数?那么如果不看代码就很难说...如果您使用JQuery选择器-那么选择器可能没有选择链接

于 2009-11-12T07:04:01.220 回答
1

这是一个“如果它可以帮助某人”的答案,因为我玩游戏的时间很晚,但您也可以使用:

@using (Ajax.BeginForm("Method", "Controller", new AjaxOptions { HttpMethod = "POST" }))
{
}

发布日期时,不会刷新页面。


请注意

必须添加jquery.unobtrusive-ajax.js才能使其正常工作。注意,在 ASP.NET MVC5 模板项目中,默认包含此脚本,必须手动添加或通过 Nuget 数据包管理器添加。它与默认情况下包含的
无关。jquery.validate.unobtrusive.js

于 2016-11-20T17:00:07.303 回答