1

Orchard に基づいて Web アプリを開発しています。

スタッフ ユーザーを管理するモジュールをコーディングしています。このユーザーは、UserPart と StaffUserPart (移行で定義されたカスタム パーツ) で構成される ContentTypes(Staff_User) です -> このパーツには MediaPickerField があります。

これは、スタッフ ユーザーの作成テンプレートを表示するコントローラーのコードです。

 public ActionResult CreateStaff() {

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

        var model = _contentManager.BuildEditor(staffUser);

        return View((object)model);
    }

OK、 EditorTemplates/Staff.cshtml にテンプレートがあります。MediaPicker フィールドは、BuildEditor 関数によって (形状として) アタッチされます。

これは 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");
    }

質問

これは機能します、MediaPickerField はデータを保存しません。デバッガーを使用して、input["StaffUserPart.Photo"] の値と値が存在するかどうかを確認します。

何か案は?

4

1 に答える 1

1

必要以上の仕事をしているようです。UpdateEditorへの呼び出しを移動すると、このメソッドは投稿された値をコンテンツに入れる作業を行います。IUpdaterを実装していることを確認する必要があります。また、ITransactionManagerへの依存関係を追加しました。これが、適切な場所に配置されていないものをキャッチするのに役立つことを願っています。

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");
}
于 2012-09-13T04:02:53.117 に答える