Как справиться с обратными передачами из нескольких строго типизированных отправляемых частичных представлений в одном представлении? - PullRequest
0 голосов
/ 13 декабря 2010
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/MasterPage.Master" Inherits="System.Web.Mvc.ViewPage<EAZYITT_LOGIN.Models.CombinedViewModel>" %>
 <asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    LoginPage
 </asp:Content>         
 <asp:Content ContentPlaceHolderID="MainContent" runat="server">         
     <div id="LoginWindow">    
         <% Html.RenderPartial("LoginWindow", ViewData.Model.Logon); %>                 
         <a id="ForgetPassword" href="#" onclick="loadSegment()">Forgot  Password</a>
     </div>         
     <div id="PassReminderWindow">
         <% Html.RenderPartial("ReminderWindow", ViewData.Model.Reminder); %>                 
     </div>
 </asp:Content>

Каждое частичное представление строго типизировано с отдельными постбэками на сервер

Логин:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<EAZYITT_LOGIN.Models.LogOnModel>" %>     
<div id="loginPage">
     <h2>Login Page</h2>     
     <h3>Submit your credentials to continue or register</h3>             

     <%: Html.ActionLink("New Registration", "Register")%>     
     <%: Html.ValidationSummary(true)%>
     <%: Html.ValidationSummary()%>     

     <div class="validation-summary-errors">
         <span id="loginError"></span>
     </div>

     <% using (Html.BeginForm("LoginWindow","Account",FormMethod.Post)) { %>

     <%:Html.LabelFor(m =>m.EmailAddress) %>
     <%:Html.ValidationMessageFor(m => m.EmailAddress) %>
     <%:Html.TextBoxFor(m => m.EmailAddress) %>

     <%:Html.LabelFor(m =>m.Password) %>
     <%:Html.ValidationMessageFor(m => m.Password) %>
     <%:Html.PasswordFor(m => m.Password)%>

     <%:Html.CheckBoxFor(m => m.RememberMe)%>
     <%:Html.LabelFor(m => m.RememberMe)%>

     <p>
         <input type="submit" value="Log On" />
     </p>

     <% } %>
</div>

Напоминание пароля:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<EAZYITT_LOGIN.Models.ReminderModel>"%>         

     <div id="PasswordReminderDiv">
         <h2>PasswordReminder</h2>

         <%: Html.ValidationSummary(true) %>
         <div class="validation-summary-errors"><span
 id="reminderError"></span></div>

         <% using (Html.BeginForm("PasswordReminder",
 "Account",FormMethod.Post))
           { //'8' o-o +:: %>

           <%:Html.LabelFor(m=>m.ReminderEmailAddress) %>
           <%:Html.ValidationMessageFor(m =>
 m.ReminderEmailAddress)%>
           <%:Html.TextBoxFor(m => m.ReminderEmailAddress) %>

           <p>
             <input type="submit" value="Send Reminder" />
           </p>
         <%} %>
     </div>

Результаты передаются их отдельным методам в контроллере:

         [HttpGet]
         public ActionResult Login()
         {
             CombinedViewModel cModel = new CombinedViewModel();

             cModel.Logon = new LogOnModel();
             cModel.Reminder = new ReminderModel();

             return View(cModel);
         }

         [HttpPost]
         public ActionResult Login(CombinedViewModel _login)
         {
             return View(_login);
         }

         [HttpGet]
         public ActionResult LoginWindow()
         {
             return PartialView();
         }

         [HttpPost]
         public ActionResult LoginWindow(LogOnModel _login)
         {
             if (ModelState.IsValid)
             {
                 if (LoginService.ValidateUser(siteId, _login.EmailAddress, _login.Password))
                 {
                     //Goto Next Page
                     ModelState.AddModelError("loginError", "LOGIN - OK");
                 }
                 else
                 {
                     //Failed Login
                     ModelState.AddModelError("loginError", "Wrong username or password");
                 }
             }

             return PartialView("LoginWindow", _login);
         }     

         [HttpGet]
         public ActionResult PasswordReminder()
         {
             return View();
         }


         [HttpPost]
         public ActionResult PasswordReminder(ReminderModel _reminder)
         {
             TempData["ModelState"] = ModelState;
             if (LoginService.ValidateNewUser(siteId, _reminder.ReminderEmailAddress))
                 ModelState.AddModelError("reminderError", "The E-mail address does not exist");

             if (ModelState.IsValid)
             {
                 ModelState.AddModelError("reminderError", "E-mail found, send e-mail to user");     
             }

             return PartialView("PasswordReminder",_reminder);     
         }

В идеале мне бы хотелось, чтобы основной вид (Login.aspx) отображался независимо от проверки.

Тем не менее, в настоящее время у меня есть работающая проверка для каждого частичного представления, НО это приводит меня к отдельным частичным представлениям о неудачной проверке, в отличие от основного представления.

Как мне получить его, чтобы обновить только частичное представление? Это способ сделать это, или я должен использовать AJAX?

1 Ответ

1 голос
/ 13 декабря 2010

Единственный способ обновить только частичное представление - это AJAX, использовать AJAX.BeginForm или JQuery. В противном случае ожидается полный жизненный цикл.

НТН.

...