2012-09-11 5 views
1

Je développe une application web basée sur Orchard.Orchard CMS enregistrer MediaPickerField

Je suis en train de coder un module qui gère les utilisateurs du personnel, ces utilisateurs sont ContentTypes (Staff_User) composé de UserPart et StaffUserPart (Partie personnalisée, définie dans une migration) -> cette partie a un MediaPickerField.

Ceci est le code dans mon contrôleur pour afficher le modèle de création d'un utilisateur du personnel

public ActionResult CreateStaff() { 

     IContent staffUser = _contentManager.New("Staff_User"); 

     var model = _contentManager.BuildEditor(staffUser); 

     return View((object)model); 
    } 

Ok, j'ai un modèle dans EditorTemplates/Staff.cshtml. Le champ MediaPicker est attaché par la fonction BuildEditor (en tant que forme).

C'est le contrôleur post:

public ActionResult CreateStaffPost(FormCollection input) { 

     IContent staffUser = _contentManager.New("Staff_User"); 

     //UserPart validation 
     if (String.IsNullOrEmpty(input["user.Email"])) 
      ModelState.AddModelError("Email", "The Email field is required."); 

     //Check if user already exits 
     var oldUser = _contentManager.Query("User").Where<UserPartRecord>(x => x.Email == input["user.Email"]) 
      .List() 
      .FirstOrDefault(); 

     if (oldUser != null) 
      ModelState.AddModelError("Email", "That email adress is already registered."); 

     if (!ModelState.IsValid) { 
      var model = _contentManager.UpdateEditor(staffUser, this); 
      return View(model); 
     } 

     StaffUserPart staff = staffUser.As<StaffUserPart>(); 
     staff.FirstName = input["FirstName"]; 
     staff.LastName = input["LastName"]; 
     staff.Location = input["Location"]; 
     staff.JobTitle = input["JobTitle"]; 
     staff.Summary = input["Summary"]; 
     staff.AreaOfExpertise = input["AreaOfExperience"]; 
     staff.Category = input["Category"]; 
     staff.Experience = input["Experience"]; 

     //Media picker field values 
     var staffImageField = (MediaPickerField)staff.Fields.Single(x => x.Name == "Photo"); 
     //TODO Fix image save during creation 
     staffImageField.Url = input["StaffUserPart.Photo.Url"]; 
     staffImageField.AlternateText = input["StaffUserPart.Photo.AlternateText"]; 
     staffImageField.Class = input["StaffUserPart.Photo.Class"]; 
     staffImageField.Style = input["StaffUserPart.Photo.Style"]; 
     staffImageField.Alignment = input["StaffUserPart.Photo.Alignment"]; 
     staffImageField.Width = String.IsNullOrEmpty(input["StaffUserPart.Photo.Width"]) ? 0 : Convert.ToInt32(input["StaffUserPart.Photo.Width"]); 
     staffImageField.Height = String.IsNullOrEmpty(input["StaffUserPart.Photo.Height"]) ? 0 : Convert.ToInt32(input["StaffUserPart.Photo.Height"]); 

     UserPart userPart = staffUser.As<UserPart>(); 
     userPart.UserName = input["user.Email"]; 
     userPart.Email = input["user.Email"]; 
     userPart.NormalizedUserName = input["user.Email"].ToLowerInvariant(); 
     userPart.Record.HashAlgorithm = "SHA1"; 
     userPart.RegistrationStatus = UserStatus.Approved; 
     userPart.EmailStatus = UserStatus.Approved; 

     //Set Password 
     _membershipService.SetPassword(userPart.As<UserPart>(), input["password"]); 

     //Create the StaffUser 
     _contentManager.Create(staffUser); 

     return RedirectToAction("Index"); 
    } 

Question

Cela fonctionne mais le MediaPickerField doesn; t enregistrer les données. J'utilise le débogueur pour voir si les valeurs de l'entrée ["StaffUserPart.Photo"] et les valeurs sont là.

Des idées?

+0

Le champ MediaPicker est attaché par la fonction BuildEditor (sous la forme d'une forme) ... pourriez-vous montrer comment procéder? – Axe

+1

Autant que je comprends, BuildEditor (ContentItem) assembler une forme avec tous les champs et les parties qui définissent cet élément de contenu. – mberacochea

Répondre

1

Il semble que vous fassiez plus de travail que nécessaire. Si vous déplacez votre appel vers UpdateEditor, cette méthode fera le travail de mettre des valeurs postées dans votre contenu. Vous devez vous assurer que vous mettez en œuvre IUpdater. De plus, j'ai ajouté une dépendance à ITransactionManager. J'espère que cela aidera à attraper quelque chose qui ne se met pas au bon endroit.

public ActionResult CreateStaffPost(FormCollection input) { 

    IContent staffUser = _contentManager.New("Staff_User"); 

    //Create the StaffUser 
    _contentManager.Create(staffUser); 

    //UserPart validation 
    if (String.IsNullOrEmpty(input["user.Email"])) 
     ModelState.AddModelError("Email", "The Email field is required."); 

    //Check if user already exits 
    var oldUser = _contentManager.Query("User").Where<UserPartRecord>(x => x.Email == input["user.Email"]) 
     .List() 
     .FirstOrDefault(); 

    if (oldUser != null) 
     ModelState.AddModelError("Email", "That email adress is already registered."); 

    //This does all the work of hydrating your model 
    var model = _contentManager.UpdateEditor(staffUser, this); 
    if (!ModelState.IsValid) { 
     _transactionManager.Cancel(); 
     return View(model); 
    } 

    //Set Password 
    _membershipService.SetPassword(userPart.As<UserPart>(), input["password"]); 

    return RedirectToAction("Index"); 
} 
+1

Merci, votre extrait fonctionne très bien. – mberacochea