2013-09-05 105 views
2

嗨,我是MVC的新手,請耐心等待。MVC4 ajax窗體不能正常工作

我正在嘗試做一個簡單的ajax窗體,只接受插入並讓用戶知道記錄已被保存到數據庫中。

我的問題是兩倍。

  1. 的數據被插入到數據庫兩次

  2. 的編輯沒有得到清除,並且不顯示的消息。

我可以得到這個工作使用直HTML表單帖子,但想要使用ajax,然後引入某種加載gif或使用spin.js.

我的代碼:

_Layout.cshtml

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width" /> 
    <title>@ViewBag.Title</title> 
    @Styles.Render("~/Content/css") 
    @Styles.Render("~/Content/kendo") 
    @Scripts.Render("~/bundles/modernizr") 
    @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/kendo") 
    @Scripts.Render("~/bundles/jqueryval") 

</head> 
<body> 
    <div id="wrapper" style="width:100%; text-align:center"> 
     <img src="~/Content/Header.PNG" alt="MyHeader" /> 
    </div> 
    @RenderBody() 


    @RenderSection("scripts", required: false) 
</body> 
</html> 

AboutController

public class AboutController : Controller 
    { 
     private readonly IMailRepository repository; 

     public AboutController(IMailRepository repo) 
     { 
      repository = repo; 
     } 

     public ActionResult AboutUs() 
     { 
      return View(); 
     } 

     public ActionResult CreateMailing() 
     { 
      return View(new MailRequest()); 
     } 

     [HttpPost] 
     public PartialViewResult CreateMailing(MailRequest model) 
     { 
      if (model == null) 
      { 
       return PartialView("_MailingData",new MailRequest()); 
      } 
      if (ModelState.IsValid) 
      { 
       repository.SaveMailRequest(model); 
       ModelState.Clear(); 
       TempData["message"] = string.Format("{0} has been added to the mailing list.", model.Email); 
       return PartialView("_MailingData",new MailRequest()); 
      } 
      else 
      { 
       return PartialView("_MailingData",model); 
      } 
     } 

    } 

_MailingDate.cshtml

@model MyProj.Models.MailRequest 

@Html.EditorForModel() 
      <br/> 
      <input type="submit" value="Save"/> 

      <input type="button" value="Cancel" 
        onclick="location.href='@Url.Action("AboutUs", "About")' " /> 
      @if (TempData["message"] != null) 
      { 
       <div>@TempData["message"]</div> 
      } 

CreateMailing.cshtml

@model MyProj.Models.MailRequest 

@{ 
    ViewBag.Title = "Mailing List"; 
    AjaxOptions ajaxOpts = new AjaxOptions 
    { 
     InsertionMode = InsertionMode.Replace, 
     UpdateTargetId = "ajaxreplace" 
    }; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Mailing List Request</title> 
</head> 
<body> 
    <div id="ajaxrequest"> 
     @using (Ajax.BeginForm(ajaxOpts)) 
     { 
      @Html.Partial("_MailingData") 
     } 
    </div> 
</body> 
</html> 

---- UPDATE

這裏是我的BundleConfig.cs

public static class BundleConfig 
    { 
     // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725 
     public static void RegisterBundles(BundleCollection bundles) 
     { 
      if (bundles == null) return; 
      // The jQuery bundle 
      bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
       "~/Scripts/jquery-{version}.js")); 
      //bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
      // "~/Scripts/jquery-{version}.js", 
      // "~/Scripts/jquery-migrate-1.1.1.js")); 


      bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
         "~/Scripts/jquery-ui-{version}.js")); 

      bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
         "~/Scripts/jquery.unobtrusive*", 
         "~/Scripts/jquery.validate*")); 


      // The Kendo JavaScript bundle 
      bundles.Add(new ScriptBundle("~/bundles/kendo").Include(
       "~/Scripts/kendo.all.min.js", 
       // or kendo.all.min.js if you want to use Kendo UI Web and Kendo UI DataViz 
       "~/Scripts/kendo.aspnetmvc.min.js")); 


      bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); 

      bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
         "~/Content/themes/base/jquery.ui.core.css", 
         "~/Content/themes/base/jquery.ui.resizable.css", 
         "~/Content/themes/base/jquery.ui.selectable.css", 
         "~/Content/themes/base/jquery.ui.accordion.css", 
         "~/Content/themes/base/jquery.ui.autocomplete.css", 
         "~/Content/themes/base/jquery.ui.button.css", 
         "~/Content/themes/base/jquery.ui.dialog.css", 
         "~/Content/themes/base/jquery.ui.slider.css", 
         "~/Content/themes/base/jquery.ui.tabs.css", 
         "~/Content/themes/base/jquery.ui.datepicker.css", 
         "~/Content/themes/base/jquery.ui.progressbar.css", 
         "~/Content/themes/base/jquery.ui.theme.css")); 

      // The Kendo CSS bundle 
      bundles.Add(new StyleBundle("~/Content/kendo").Include(
       "~/Content/kendo.common.*", 
       "~/Content/kendo.uniform.*")); 


      // Clear all items from the ignore list to allow minified CSS and JavaScript files in debug mode 
      bundles.IgnoreList.Clear(); 


      // Add back the default ignore list rules sans the ones which affect minified files and debug mode 
      bundles.IgnoreList.Ignore("*.intellisense.js"); 
      bundles.IgnoreList.Ignore("*-vsdoc.js"); 
      bundles.IgnoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled); 
     } 


    } 

我覺得我的數據庫問題可能有一些做的其實我結束了在以下我的網頁HTML

<script src="/bundles/modernizr"></script> 

    <script src="/Scripts/jquery-2.0.0.js"></script> 
<script src="/Scripts/jquery-2.0.3.js"></script> 

    <script src="/Scripts/kendo.all.min.js"></script> 
<script src="/Scripts/kendo.aspnetmvc.min.js"></script> 

    <script src="/Scripts/jquery.unobtrusive-ajax.js"></script> 
<script src="/Scripts/jquery.unobtrusive-ajax.min.js"></script> 
<script src="/Scripts/jquery.validate.js"></script> 
<script src="/Scripts/jquery.validate.min.js"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.js"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script> 

我猜我不應該有兩個註冊的充分分鐘的js腳本,但我不知道,以防止該W的最佳方式休斯特依然採用捆綁

我EFMailRepository

public class EFMailRepository : IMailRepository, IDisposable 
    { 
     private EFDbContext context = new EFDbContext(); 


     public void SaveMailRequest(MailRequest mailRequest) 
     { 
      context.MailingList.Add(mailRequest); 
      context.SaveChanges(); 
     } 

     protected virtual void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       // dispose managed resources 
       context.Dispose(); 
      } 
      // free native resources 
     } 


     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
    } 
+1

這看起來很容易[簡單地重現問題](http://sscce.org/)。 –

+0

第一個建議是使用'Html.beginform'而不是'Ajax。BeginForm',然後使用jQuery來Ajax化表單,看看那裏[這裏](http://stackoverflow.com/questions/5410055/using-ajax-beginform-with-asp-net-mvc-3-razor) (它是MVC 3,但它的工作原理是一樣的),也是一個很快的問題:我沒有在視圖中看到帶'ajaxreplace' id的元素,它在哪裏? –

+0

爲什麼你會推薦使用jquery的ajax而不是'Ajax.BeginForm'? – WannaCSharp

回答

1

你忘了周圍的部分的#ajaxreplace格:

<div id="ajaxrequest"> 
    @using (Ajax.BeginForm(ajaxOpts)) 
    { 
     <div id="ajaxreplace"> 
      @Html.Partial("_MailingData") 
     </div> 
    } 
</div> 

你已經在你的AjaxOptions使用這個ID,所以你應該有一個相應的元素在您的DOM中,將通過AJAX請求的結果進行更新:

AjaxOptions ajaxOpts = new AjaxOptions 
{ 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "ajaxreplace" 
}; 

只要您關於數據在數據庫中插入兩次的第一個問題涉及到,您尚未提供有關DAL圖層的足夠詳細信息,以便我們能夠進一步診斷問題。也許你的repository.SaveMailRequest方法有問題。

+0

感謝堆,工作!我已經更新了關於雙數據庫條目的帖子。有任何想法嗎??? –

+0

爲什麼你包含所有的腳本兩次?你應該只包括他們一次。如果你包含兩次,你可能會得到2個AJAX調用。這是你的腳本內容完全混亂。例如,你有2個不同版本的jQuery,包括無法工作。只保留'.min.js'版本。在你的代碼中也沒有任何地方可以看到'repository.SaveMailRequest'方法的實現。 –

+0

我已更新帖子以包含** bold ** SaveMailRequest方法。腳本捆綁註冊(就不顯眼的&驗證.js去)來自vs2012基本的MVC4模板。我將從我的腳本文件夾中刪除所有非min .js腳本,其中包含最小版本,並嘗試使用 –