【问题标题】:How to change the email address of a user in ASP.NET MVC如何在 ASP.NET MVC 中更改用户的电子邮件地址
【发布时间】:2016-07-23 10:49:09
【问题描述】:

我正在开发一个 ASP.NET MVC4 应用程序。我实际上希望能够更改用户的电子邮件地址。

修改电子邮件.cshtml

@model Project.Models.ModifyEmailModel

@using (Html.BeginForm("Manage", "Account")) {
@Html.AntiForgeryToken()

@Html.ValidationSummary(true)

<fieldset>
    <legend>Change Email Address</legend>
    <ol>
        <li>
            @Html.LabelFor(m => m.OldEmailAddress)
            @Html.EditorFor(m => m.OldEmailAddress)
            @Html.ValidationMessageFor(m => m.OldEmailAddress)
        </li>
        <li>
            @Html.LabelFor(m => m.NewEmailAddress)
            @Html.EditorFor(m => m.NewEmailAddress)
            @Html.ValidationMessageFor(m => m.NewEmailAddress)
        </li>
        <li>
            @Html.LabelFor(m => m.ConfirmEmailAddress)
            @Html.TextBoxFor(m => m.ConfirmEmailAddress)
            @Html.ValidationMessageFor(m => m.ConfirmEmailAddress)
        </li>
    </ol>
    <input type="submit" value="Changer l'addresse email" />
</fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

AccountModels.cs

    namespace Project.Models
{
    public class UsersContext : DbContext
    {
        public UsersContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<UserProfile> UserProfiles { get; set; }

    }


    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string EmailId { get; set; }
        public string Details { get; set; }
    }


    public class ModifyEmailModel
    {
        [Required(ErrorMessage = "l'addresse email actuelle est requise")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Addresse email actuelle")]
        public string OldEmailAddress { get; set; }

        [Required(ErrorMessage = "la nouvelle addresse email est requise")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Nouvelle addresse email")]
        public string NewEmailAddress { get; set; }

        [DataType(DataType.EmailAddress)]
        [Display(Name = "Confirmer la nouvelle addresse mail")]
        [Compare("NewEmailAddress", ErrorMessage = "Le nouvelle addresse email et la confirmation de l'addresse email ne correspondent pas.")]
        public string ConfirmEmailAddress { get; set; }
    }




}

我不知道如何在 AccountController.cs 中实现该操作,请帮助!

【问题讨论】:

  • 您的帐户控制器现在有什么?
  • 对不起。但你的问题很不清楚。你想做什么?你还试过什么??
  • 我想创建一个动作 ModifyEmail 以便能够输入旧/新并确认电子邮件并将其保存到数据库中。它应该类似于管理密码,但我不知道如何实现它
  • 好吧,我有很多动作。我想为用户添加此功能以便能够管理他/她的电子邮件地址

标签: asp.net-mvc-4


【解决方案1】:

我从您的描述中了解到,您需要一种操作方法来修改电子邮件地址。因此,您可以尝试以下方法,

[HttpPost]
public ActionResult Manage(ModifyEmailModel data)
{
    if(data.NewEmailAddress == data.ConfirmEmailAddress)
    {
        // db is your context instance
        var u = db.UserProfiles.Where(x => x.EmailId == OldEmailAddress).SingleOrDefault();
        u.EmailID = data.NewEmailAddress;
        db.SaveChanges();

    }
    else
        string error = "Email ID's don't match";
    return View();
}

要在 GET 方法(即加载视图的方法)中在视图中显示电子邮件,请输入以下内容,

public ActionResult Manage()
{
    // at this point you must have the username for your currently logged in user
    var u = db.UserProfiles.Where(x => x.UserName == UserName).SingleOrDefault();
    return View(u);
}

【讨论】:

  • 谢谢!我实际上还有其他一些问题我想显示当前的电子邮件地址,所以在我放置的视图中:@Html.LabelFor(m => m.OldEmailAddress) @Html.DisplayFor(m => m.OldEmailAddress) 但它没有显示电子邮件地址
  • 它是从控制器加载的吗??
  • 什么意思?没看懂,抱歉
  • 在加载视图时,OldEmailAddress 属性是否有数据??
  • 否,但我想将其链接到数据库中的 EmailId
【解决方案2】:

默认身份帐户控制器使用管理操作来更新或创建密码,对吗?如果您想保留这一点,我建议您为类似 ManageEmail 的内容创建另一个 GET 操作,您可以在其中返回您刚刚通过链接或单击原始管理页面下的按钮创建的视图。然后创建一个 POST 操作 ManageEmail 以与新电子邮件同步更改电子邮件/更新。

在 Manage.cshtml 中,您可以使用 Html.Action 在其中调用不同的 get 方法。

@Html.Partial("_ChangePassword") // change password partial here
@Html.Action("ManageEmail") // this will call the partial view page with your custom model


在您的 AccountController.cs 中添加以下 2 个方法:

//GET ManageEmail
public ActionResult ManageEmail()
{
   var model = new ModifyEmailModel()
    {
     OldEmailAddress = UserManager.GetEmail(User.Identity.GetUserId()) // this will load the current email for your view
    };
   return View("_ManageEmail",model); // _ManageEmail is your partial view name

}

//POST ManageEmail
[HttpPost()]
[ValidateAntiForgeryToken()]
public async Task<ActionResult> ManageEmail(ModifyEmailModel data)
{
  //some validation here like if email is valid or not existing in the database to avoid duplicate
  var user = UserManager.FindById(User.Identity.GetUserId());
  await UserManager.UpdateAsync(user);
  return RedirectToAction("Manage");
}


然后只需编辑部分视图以针对 ManageEmail POST 操作。

【讨论】:

  • @xxxx 如果是这种情况,那很好,但我建议您将 get 方法分开用于两个不同的工作。您可以通过使用 Html.Action 调用 get 方法来加载局部视图。让我更新我的答案,我会告诉你的。
  • @xxxx 看到我更新的答案,应该是你要找的。​​span>
  • @xxxx 很高兴它有帮助。祝你好运! ~
  • @xxxx UserManager 是内置存储库,其中包含可用于对 User 类执行不同操作的方法,例如 UpdateAsync、GetByIdAsync。我建议您在这里需要更多关于 aspnet 身份的信息。 asp.net/identity/overview/getting-started/…
  • @xxxx 根据您使用的 MVC 版本,它的调用方式可能与 ApplicationUserManager 不同。通过查看 AccountController.cs 中的 HttpPost Manage 方法,您可以轻松找到 Visual Studio 为您生成的内容,它使用什么来更改用户的密码。
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2016-10-14
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多