2013-07-05 2 views
0

В настоящее время я использую стандартный Управление страницу, которая выглядит как:ViewBag и форматирование

public ActionResult Manage(string type = "") 
    { 
     ViewBag.Type = type; 
     switch (type) 
     { 
      case "EmailAddress": 
       ViewBag.EmailAddress = lol.UserProfiles.Find((int)Membership.GetUser().ProviderUserKey).EmailAddress; 
       break; 
      case "Password": 
       break; 
      default: 
       break; 
     } 
     //ViewBag.ReturnUrl = Url.Action("Manage/" + type); 
     return View(); 
    } 

Теперь моя Управление Модель страница выглядит следующим образом:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Manage(ManageViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      if (model.EmailAddressModel != null) 
      { 
       try 
       { 
        int userID = (int)Membership.GetUser().ProviderUserKey; 
        var User = lol.UserProfiles.First(f => f.UserId == userID); 
        User.EmailAddress = model.EmailAddressModel.EmailAddress; 
        int saveStatus = lol.SaveChanges(); 

        if (saveStatus == 1) 
        { 
         ViewBag.StatusMessage = MessagesEnum.ChangeEmailSuccess; 
         return RedirectToAction("Manage/EmailAddress", "Account"); 

        } 
        else 
        { 
         ModelState.AddModelError("", MessagesEnum.ChangeEmailFailed); 
        } 

       } 
       catch { } 
      } 
      else 
      { 
       // ChangePassword will throw an exception rather than return false in certain failure scenarios. 
       bool changePasswordSucceeded; 
       try 
       { 
        changePasswordSucceeded = WebSecurity.ChangePassword(User.Identity.Name, model.PasswordModel.OldPassword, model.PasswordModel.NewPassword); 
       } 
       catch (Exception) 
       { 
        changePasswordSucceeded = false; 
       } 

       if (changePasswordSucceeded) 
       { 
        ViewBag.StatusMessage = MessagesEnum.ChangePasswordSuccess; 
        return RedirectToAction("Manage/Password", "Account"); 
       } 
       else 
       { 
        ModelState.AddModelError("", MessagesEnum.ChangePasswordFailed); 
       } 
       } 
     } 
     else 
     { 
     } 
     return View(model); 
    } 

Мой ManageViewModel класс:

public class ManageViewModel 
{ 
    public LocalPasswordModel PasswordModel { get; set; } 
    public LocalEmailAddressModel EmailAddressModel { get; set; } 
} 

То, что я пытался сделать, это сделать, если они получают доступ к нескольким страницам в разделе Управление такими как/Управление/Пароль и/Управление/Emai lAddress и в соответствии с этими ссылками он разместит другую страницу. Теперь, прежде всего, это правильный способ сделать это/это нормально? Во-вторых, если это так, я пытался передать сообщение Sucess после того, как они изменили свой адрес электронной почты на страницу/Manage/EmailAddress, но ViewBag.StatusMessage ничего не выводит на мою HTML-страницу. Почему это?

Я сделал немного больше исследований, и вот мои выводы (скажите, правильно это или нет). Так что я должен изменить параметры маршрута и так что-то вроде:

routes.MapRoute(
      name: "Manage", 
      url: "Account/{controller}/{action}/{id}", 
      defaults: new { controller = "Manage", action = "Index", id = UrlParameter.Optional} 
     ); 

И просто сделать новый контроллер под названием Управление и создавать новые функции внутри контроллера для разных страниц, как ChangeEmail и Changepassword?

+0

Ваш счетчик сменных сумм закомментирован. А вы знаете это? – Botonomous

+0

Я не следую? –

+0

ViewBag.ReturnUrl = Url.Action («Управление /» + тип); имеет два // перед кодом. Это комментарий и пропущен переводчиком. Удалите их и Viewbag.ReturnURL будет установлен. – Botonomous

ответ

0

ViewBag и ViewData действительны только для текущего запроса, они не выживут, если вы перенаправите RedirectToAction. Вместо этого используйте TempData. Проверьте следующее: ViewBag, ViewData and TempData

Если вы хотите, чтобы ваши URL-адреса, чтобы быть/Управление/пароль и/Управление/EmailAddress, вам не нужно, чтобы добавить новый MapRoute, по умолчанию один будет работать. Просто используйте ManageController для имени класса контроллера и «Пароль» и «EmailAddress» для имен ваших функций:

class ManageController 
{ 
    public ActionResult Password(...) 
    { 
+0

Хорошо, он работает. У меня есть еще один вопрос, я добавил EDIT на свой пост, начиная с пункта «Я сделал немного больше исследований». Является ли этот метод хорошим методом? –

+0

Вы хотите, чтобы ваши URL-адреса были учетной записью/управлением/паролем или просто/управляли/паролем? – fcuesta

+0

В настоящее время, как он настроен, я должен использовать случай SELECT для разных типов ссылок, таких как Account/Manage/LINKS_HERE. Можете ли вы в основном настроить Маршрут карты, как показано выше, вместо того, чтобы иметь элементы в AccountController, я могу создать ManageController, но ссылка все равно будет Account/Manage/LINKS_HERE и создаст функции для разных LINKS_HERE? –

Смежные вопросы