2013-02-11 3 views
1

Я просмотрел различные учебники, но я очень смущен тем, как я хочу заниматься тем, что имею в виду, и хочу помочь прояснить мои мысли.Настройка страницы просмотра бритвы с несколькими разделами

У меня будет страница просмотра бритвы под названием Profile; на этой странице профиля У меня есть четыре раздела:

  1. изменения пароля
  2. Настройка пароля
  3. Имя пользователя
  4. Биография.

Я думал о создании каждого из четырех разделов как частичный раздел, и каждый раздел будет иметь текстовые поля и кнопку сохранения, которые позволят пользователю добавлять или изменять информацию.

@model Projects.Models.PasswordModel 
@{ 
    ViewBag.Title = "Profile Account"; 
} 

<hgroup class="title"> 
    <h1>@ViewBag.Title.</h1> 
</hgroup> 

<p class="message-success">@ViewBag.StatusMessage</p> 


<div id="wrap"> 
    <div id="right"> 
     @if (ViewBag.HasLocalPassword) 
     { 
      @Html.Partial("_ChangePasswordPartial") 
     } 
     else 
     { 
      @Html.Partial("_SetPasswordPartial") 
     } 
    </div> 

    <div id="left"> 
     @Html.Partial("_UserNamePartial") 
     @Html.Partial("_BiographyPartial") 
    </div> 
</div> 

Как правильно настроить основную страницу просмотра и правильно ли отобразить и функционировать четыре раздела? Я получил их для отображения, но когда я попытаюсь сохранить изменения, которые я сделал для имени пользователя, я бы получил ошибку для другой модели - скажем, модель биографии. Я чувствую, что они связаны, когда они не должны. Я действительно ищу ясный учебник о том, как это сделать, и, надеюсь, я смогу сделать это после того, как я это выясню.

Это мое имя пользователя парциальное

@model Project.Models.UsernameModel 

@using (Html.BeginForm("_UsernamePartial", "Account")) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

     <p>Username</p> 
     @Html.TextBoxFor(m=>m.Username) 

    <button class="btn btn-small" type="submit" value="Save Username">Save</button> 
} 

Мой контроллер

GET:

public ActionResult _UsernamePartial() 
     { 
      var usernameModel = new UsernameModel(); 
      using (var db = new DataContext()) 
      { 
       usernameModel.Nickname = (from u in db.Users 
               where u.ID == WebSecurity.CurrentUserId 
               select u.Username).FirstOrDefault(); 
      } 
      return View(usernameModel); 
     } 

POST:

[HttpPost] 
     public ActionResult _UsernamePartial(UsernameModel usernameModel, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       using (var db = new DataContext()) 
       { 
        User user = db.Users.FirstOrDefault(m => m.ID == WebSecurity.CurrentUserId); 
        user.Username = usernameModel.Username; 
        db.SaveChanges(); 
       } 
       return RedirectToAction("_UsernamePartial"); 
      } 
      return View(returnUrl); 
     } 

Ваш помощь очень ценится.

+0

У Вас есть различные модели для каждого раздела? Ваше мнение строго типизировано в PasswordModel, которое появляется отдельно от указанной вами биографической модели. Если вы собираетесь это сделать, вам понадобится модель, состоящая из моделей для каждого раздела. – JeffB

+0

@JeffB что-то вроде этого может быть: 'public class AccountManageModel { public LocalPasswordModel PasswordModel {get; задавать; } public NicknameModel UsernameModel {get; задавать; } public ProgramNameModel biographyModel {get; задавать; } } 'и каждый будет своим классом? – 072et

+0

Да, что-то в этом роде. Затем вы можете передать каждый в соответствующий частичный вид. – JeffB

ответ

1

Вам нужно убедиться, что ваши взгляды напечатаны в правильной модели. Ваше представление в настоящее время напечатано на модели PasswordModel, которая выглядит как один раздел вашей страницы. Если вы создаете модель, состоящую из моделей для каждой секции, он будет делать это проще:

class ProfileModel { 
    PasswordModel Password { get; set; } 
    BiographyModel Biography { get; set; } 
    ... 
} 

Вы бы затем установить Профилирование быть напечатанными на ProfileModel. Затем вы можете передать каждую модель с частичными:

@Html.Partial("_BiographyPartial",Model.Biography) 

И пример _BiographyPartial будет выглядеть так:

@model Projects.Models.BiographyModel 
... 
<h1>@Model.SomeBiographyProperty</h2> 

Вы должны быть осторожны, чтобы проверить, что ваши проверки, если у вас есть некоторые, работает правильно с этой настройкой.

В качестве альтернативы вы можете поместить все свои данные в одну плоскую модель и передать всю модель на каждый частичный вид.

EDIT: Частичные виды не поддерживаются контроллерами и действиями, это просто виды, которые визуализируются с использованием данных, которые вы передаете им из вызывающего вида.То, что вы пытаетесь сделать прямо сейчас, представляет собой действие _UsernamePartial. Если вы хотите сделать, что вы можете попробовать использовать Action вместо Partial:

<div id="left"> 
    @Html.Action("_UserNamePartial") 
    ... 
</div> 

И делают это действие как частичный вид:

public ActionResult _UsernamePartial() 
{ 
    var usernameModel = new UsernameModel(); 
    using (var db = new DataContext()) 
    { 
     usernameModel.Nickname = (from u in db.Users 
            where u.ID == WebSecurity.CurrentUserId 
            select u.Username).FirstOrDefault(); 
    } 
    return PartialView(usernameModel); 
} 
+0

Я пойду вперед и попробую это сейчас, и, надеюсь, это сработает. Спасибо заранее – 072et

+0

Не знаю, что я могу делать неправильно или не хватает, чтобы получить это сообщение: «Ссылка на объект не установлена ​​в экземпляр объекта». Он показывает '@ Html.Partial (« _ Password », Model.Password) ' – 072et

+0

Что вы возвращаетесь с вашего контроллера? Это должно быть что-то вроде View (new AccountModel()) или экземпляр вашей модели, который вы создали ранее. – JeffB

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