2011-02-03 97 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