1

我在一个视图上有“重置密码”和“用户个人资料信息更新”部分。

我有一个带有两个子模型的父模型:ResetPwdModel 和 UserInfoModel。

对于重置密码提交和保存配置文件信息提交,我希望结果 URL 看起来相同(与当前 URL 相同),这样用户就不会感到困惑。

为了实现这一点,我重载了动作方法,一个接受 ResetPwdModel,另一个接受 UserInfoModel。但是,我收到错误消息The current request for action 'profile' on controller type 'XXController' is ambiguous...

有没有优雅的方法来解决这个问题?我的目标是能够在 1 个视图中使用两个模型,并使帖子 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 无关。

首先,您是否使用两个单独的 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 回答