2011-02-03 130 views
13

我一直非常不成功,讓這個工作!ASP.net MVC3 - Razor視圖和部分視圖與Ajax回傳

在視圖中......

@model Project.Models.Account.ForgotPasswordModel 

@{ 
    ViewBag.Title = "Forgot Password"; 
} 

<h2>ForgotPassword</h2> 

<span id='@ViewBag.ReplaceID'> 
    @Html.Partial("_ForgotPasswordUserNameAjax", ViewData.Model) 
</span> 

我使這個partialView ...

@model Project.Models.Account.ForgotPasswordModel 

@{ 
    this.Layout = null; 
} 

@using (Ajax.BeginForm("ForgotPassword", new AjaxOptions() { UpdateTargetId = ViewBag.ReplaceID, InsertionMode = InsertionMode.InsertAfter })) 
{ 
    @Html.ValidationSummary(true, "Forgot Password was unsuccessful. Please correct the errors and try again.") 
    <div id="login" class="box"> 
      <fieldset> 
      <h2>Account Information</h2> 
      <div class="inside"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.Username) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.Username) 
        <br /> 
        @Html.ValidationMessageFor(m => m.Username) 
        <br /> 
       </div> 

       <p> 
        <input type="submit" value='Submit' /> 
       </p> 
      </div> 
     </fieldset> 
    </div> 
} 

而這個控制器動作......

[HttpPost] 
     public PartialViewResult ForgotPassword(ForgotPasswordModel model) 
     { 

      if (String.IsNullOrEmpty(model.Username)) 
      { 
       ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_REQUIRED); 
      } 
      else 
      { 
       bool isGood = false; 
       model.Question = this._security.ValidateUserNameGetSecurityQuestion(model.Username, out isGood); 

       if (!isGood) 
       { 
        ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_INVALID); 
       } 

      } 
      PartialViewResult retVal = null; 
      if (ModelState.IsValid) 
      { 

       retVal = PartialView("ForgotPasswordAnswerAjax", model); 
      } 
      else 
      { 
       retVal = PartialView("_ForgotPasswordUserNameAjax", model); 
      } 

      return retVal; 

     } 

然而,每一次,視圖只返回PartialView,不包含在佈局中(所以只是我的PartialView在屏幕上,沒有別的)。我試過了af EW事情我已經在網上找到... http://www.compiledthoughts.com/2011/01/aspnet-mvc-razor-partial-views-with.html http://stackoverflow.com/questions/4655365/mvc3-submit-ajax-form

但是,什麼也修復了這個問題。我已將InsertionMode更改爲所有值而不更改。我已將@ Html.Partial更改爲代碼塊,如 @ { Html.RenderPartial(「_ ForgotPasswordUserNameAjax」,ViewData.Model); }。

這不起作用...

我用盡了想法(和耐心)!

請幫忙!

回答

8

編輯 PEBKAC。

我忘了升級項目時,我添加了新的jquery.unobtrusive-ajax.js文件,但從未將它們包含在_Layout.cshtml頁面中。添加該庫在解決問題。對不起大家!

原帖 我開始認爲這是一個錯誤。再次將未轉換的項目(MVC2)轉換爲MVC3。我將所有原始頁面保留爲aspx/ascx格式並運行該項目。我試過這個頁面。同樣的問題仍然存在。回到MVC2,它工作正常。再次嘗試MVC3,問題再次發生。

我使用頁面非常相似,這...

http://mattsieker.com/index.php/2010/11/21/converting-asp-net-mvc2-project-to-mvc3/

0

我認爲「主要」視圖也稱爲ForgotPassword,就像部分視圖一樣。

由於控制器僅返回PartialViewResult,因此不使用佈局。

爲父視圖和ajax調用創建不同的操作。

+0

嗯,我從MVC2應用程序除了將這個項目MVC3超過剃刀改變了看法。在切換到MVC3之前,這些工作非常好。我期望不必更改控制器代碼(除了帶下劃線的視圖的新命名)。 ( – DavidAndroidDev 2011-02-03 16:35:01

1

既然你只返回一個局部視圖轉換的項目,那就是被處理的所有。由於處理Razor視圖的方式,此功能在MVC3中更加嚴格。

您的控制器動作簡單地更改爲以下:

[HttpPost] 
     public ActionResult ForgotPassword(ForgotPasswordModel model) 
     { 

      if (String.IsNullOrEmpty(model.Username)) 
      { 
       ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_REQUIRED); 
      } 
      else 
      { 
       bool isGood = false; 
       model.Question = this._security.ValidateUserNameGetSecurityQuestion(model.Username, out isGood); 

       if (!isGood) 
       { 
        ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_INVALID); 
       } 

      } 
      PartialViewResult retVal = null; 
      if (ModelState.IsValid) 
      { 

       retVal = View("ForgotPasswordAnswerAjax", model); 
      } 
      else 
      { 
       retVal = PartialView("_ForgotPasswordUserNameAjax", model); 
      } 

      return retVal; 

     } 
+0

雖然這使我更多的格式化,但我完全忽略了部分視圖的父視圖中的所有內容,但並不多,但如果其他頁面包含更多內容,我不得不將它放在局部視圖?那麼局部視圖有什麼用呢? – DavidAndroidDev 2011-02-03 21:28:25