我在一个视图上有“重置密码”和“用户个人资料信息更新”部分。
我有一个包含两个子模型的父模型: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);
}
答案 0 :(得分:4)
您的操作方法名称与您希望响应网址无关。
首先,您使用两个单独的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");
答案 1 :(得分: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");
}
通过这种方式,用户不会感到困惑。
答案 2 :(得分:0)
Controller has overload的View()方法具有接受视图名称作为参数的重载。因此,您可以在不同的操作中使用相同的视图。