1

1つのビューに「パスワードのリセット」セクションと「ユーザープロファイル情報の更新」セクションがあります。

ResetPwdModelとUserInfoModelの2つの子モデルを持つ親モデルがあります。

パスワードのリセット送信とプロファイル情報の保存送信の両方で、結果のURLを同じ(現在のURLと同じ)に見せたいので、ユーザーが混乱することはありません。

これを実現するために、一方がResetPwdModelを受け入れ、もう一方がUserInfoModelを受け入れるようにアクションメソッドをオーバーロードしました。ただし、エラーメッセージが表示されますThe current request for action 'profile' on controller type 'XXController' is ambiguous...

これを解決するためのエレガントな方法はありますか?私の目標は、1つのビューで2つのモデルを使用し、投稿URLを現在のURLと同じように見せることです。

モデル

public class ProfileParentModel
{
    public ProfileResetPwdModel ResetPwd { get; set; }
    public ProfileUserInfoModel UserInfo { get; set; }
}

public class ProfileResetPwdModel
{
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Profile_lbl_OldPassword", ResourceType = typeof(Resource))]
    public string OldPassword { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Profile_lbl_NewPassword", ResourceType = typeof(Resource))]
    public string NewPassword { get; set; }

    [Compare("NewPassword", ErrorMessageResourceName = "Profile_Error_NotMatch", ErrorMessageResourceType = typeof(Resource))]
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Profile_lbl_ConfirmNewPassword", ResourceType = typeof(Resource))]
    public string ConfirmNewPassword { get; set; }
}

public class ProfileUserInfoModel
{
    [Display(Name = "Profile_lbl_FirstName", ResourceType = typeof(Resource))]
    public string FirstName { get; set; }

    [Display(Name = "Profile_lbl_LastName", ResourceType = typeof(Resource))]
    public string LastName { get; set; }

    [Display(Name = "Profile_lbl_WorkTitle", ResourceType = typeof(Resource))]
    public string WorkTitle { get; set; }

    [Display(Name = "Profile_lbl_CompanyName", ResourceType = typeof(Resource))]
    public string CompanyName { get; set; }

    [Display(Name = "Profile_lbl_CompanyAddress", ResourceType = typeof(Resource))]
    public string CompanyAddress { get; set; }
}

意見

@{
    var passwordHtml = Html.HtmlHelperFor(Model.ResetPwd);
    var profileHtml = Html.HtmlHelperFor(Model.UserInfo);
}
@using (passwordHtml.BeginForm())
{
    //HTML goes here...
}
@using (profileHtml.BeginForm())
{
   //HTML goes here...
}

コントローラ

        [ActionName("Profile")]
    [HttpPost]
    [Authorize]
    public ActionResult ResetPassword(ProfileResetPwdModel model)
    {

        return View("Profile", parentModel);
    }

    [ActionName("Profile")]
    [HttpPost]
    [Authorize]
    public ActionResult SaveUserInfo(ProfileUserInfoModel model)
    {
        return View("Profile", parentModel);
    }
4

3 に答える 3

4

アクションメソッド名は、応答URLをどのようにするかとは無関係です。

まず、2つの別々のHtmlフォームを使用してデータを送信していますか?これが最善の方法だと思います。それぞれに異なるアクションを示します。その後、アクションは必要なアクションにリダイレクトできます。

次に、フレームワークはプロパティを自動的に処理できないため(最初に親モデルを使用するため)、アクションのパラメーターとして子モデルを指定することはできませんが、これは実際には名前の定義方法によって異なりますあなたのフォームフィールドの。

Html.TextBoxForたとえば、メソッドを使用している場合。次に、これにより「parent.childproperty」というフィールド名が付けられます。この場合、両方のアクションのパラメーターとして親モデルを使用する必要があります。

public ActionResult ResetPassword(ParentModel model)...
public ActionResult UpdateInfo(ParentModel model)...

子クラスのプロパティと一致するようにフィールド名を自分で手動で設定することに満足している場合は、子モデルをパラメーターとして使用できます。

public ActionResult ResetPassword(ResetPwdModel model)...
public ActionResult UpdateInfo(UserInfoModel model)...

次のように設定されたフィールドを使用:

@Html.TextBox("NewPassword", Model.ResetPwdModel.NewPassword)

そしてそれらは正しくマッピングされます。

各アクションを処理した後、最後に以下を追加するだけです。

return RedirectToAction("Profile");
于 2012-08-31T13:52:19.830 に答える
1

各アクションの最後にリダイレクトを行うことをお勧めします。

public ViewResult Profile()
{
   ...get the profile info of the user from db
   return View(profile);
}

[HttpPost]
public ActionResult ResetPassword(ProfileResetPwdModel model)
{
   ...reset the password
   return RedirectToAction("Profile");
}

public ActionResult SaveUserInfo(ProfileUserInfoModel model)
{
   ...update the profile
   return RedirectToAction("Profile");
}

このようにして、ユーザーが混乱することはありません。

于 2012-08-31T14:56:27.277 に答える
0

ControllerのView()メソッドには、ビューの名前を引数として受け入れるオーバーロードがありますしたがって、異なるアクションで同じビューを使用できます。

于 2012-08-31T14:00:26.353 に答える