Question

Je me suis mise à niveau d'une application dans le Développement de MVC4/EF5 à MVC5/EF6 à utiliser (entre autres choses) ASP.Net l'Identité.Lorsque j'essaie de Créer un Utilisateur, mon code est en berne le Modèle comme Invalide et non de la création de l'utilisateur.De mon point de Vue est tout simplement l'affichage d'une boîte pour entrer un e-mail, puis un Interrupteur qui permet à l'utilisateur connecté en admin, sélectionnez un MemberOrganization ou Sponsor pour l'attribution de la nouvelle de l'utilisateur 2 via des listes déroulantes.

La méthode Create() de mon UserController est ci-dessous:

        // GET: Admin/UserManagement/Create
        public ActionResult Create()
        {
            ViewBag.headerTitle = "Create User";
            ViewData["Organization"] = new SelectList(db.MemberOrganizations, "Id", "Name");
            ViewData["Sponsor"] = new SelectList(db.SponsorOrganizations, "Id", "Name");
            ViewBag.SwitchState = true;
            ApplicationUser newUser = new ApplicationUser();
            newUser.RegisteredDate = DateTime.Now;
            newUser.LastVisitDate = DateTime.Now;
            newUser.ProfilePictureSrc = null;
            return View(newUser);
        }

        // POST: Admin/UserManagement/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Create([Bind(Include = "Property1, Property2, etc.")] ApplicationUser applicationUser)
        {
            if (ModelState.IsValid)
            {
                ViewBag.headerTitle = "Create User";
                PasswordHasher ph = new PasswordHasher();
                var password = ph.HashPassword("aR@nD0MP@s$w0r9");
                var user = new ApplicationUser() { UserName = applicationUser.UserName, Email = applicationUser.Email, PasswordHash = password };
                IdentityResult result = await UserManager.CreateAsync(user, user.PasswordHash);
                if (result.Succeeded)
                {
                    await db.SaveChangesAsync();
                    return RedirectToAction("Index", "UserManagement");
                }
                else
                {
                    ModelState.AddModelError("", "Failed to Create User.");
                }
            }

            ModelState.AddModelError("", "Failed to Create User.");

            var errors = ModelState.Where(x => x.Value.Errors.Count > 0).Select(x => new { x.Key, x.Value.Errors }).ToArray();

            var errors2 = ModelState.Values.SelectMany(v => v.Errors);

            ViewData["Organization"] = new SelectList(db.MemberOrganizations, "Id", "Name", applicationUser.MemberOrgId);
            ViewData["Sponsor"] = new SelectList(db.SponsorOrganizations, "Id", "Name", applicationUser.SponsorOrgId);
            if (applicationUser.MemberOrgId != null)
            {
                ViewBag.SwitchState = true;
            }
            else
            {
                ViewBag.SwitchState = false;
            }
            ViewBag.OrganizationId = new SelectList(db.MemberOrganizations, "Id", "State", applicationUser.MemberOrgId);

            // If we got this far, something failed, redisplay form
            return View(applicationUser);

        }

Dans mes tentatives pour déboguer le problème, j'ai ajouté l' errors/errors2 des variables comme le suggère l' cette post.En allant vers le Modèle de propriétés de l'État lorsque ceux-ci sont repérés je reçois:

InvalidModelState1

InvalidModelState2

Quelqu'un aurait-il quelques réflexions sur cette question?Mon précédent code fonctionne très bien mais je suis encore en train de l'utiliser pour ASP.Net l'Identité.

MODIFIER:Comme suggéré par Rikard j'ai réglé mon modèle où SponsorOrgID et MemberOrgID ne sont pas imposés (1 seul).Maintenant mon code processus jusqu'à ce que le segment suivant:

var user = new ApplicationUser() { Name = applicationUser.Name, Email = applicationUser.Email, PasswordHash = password };
                IdentityResult result = await UserManager.CreateAsync(user, user.PasswordHash);
if (result.Succeeded) // ERROR
{
    await db.SaveChangesAsync();
    return RedirectToAction("Index", "UserManagement");
}

Lorsque je vérifie la valeur de result et de forage vers le bas pour Errors->[string[]]->[0] le message d'erreur est: Name cannot be null or empty.N'importe qui ont des idées sur ce point?J'ai ajouté un champ à mon avis, pour spécifier les nouveaux utilisateurs Name et l'a incorporé dans le ci-dessus new ApplicationUser() la ligne de code.Je ne suis pas entièrement sûr de l'endroit où je suis en manque de quelque chose.

EDIT2: Create() De La Vue [Pertinentes]:

@model PROJECTS.Models.ApplicationUser

@{
    ViewBag.Title = "Create";
    Layout = "~/Areas/Admin/Views/Shared/_LayoutAdmin.cshtml";
    string cancelEditUrl = "/Admin/UserManagement/";
}

@using (Html.BeginForm("Create", "UserManagement", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    @Html.HiddenFor(model => model.RegisteredDate)

    <div class="container">

        <div class="row">
            <div class="editor-label">
                @Html.LabelFor(model => model.Name)
            </div>
            <div class="editor-field" style="margin-bottom: 15px">
                @Html.TextBoxFor(model => model.Name, new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Name)
            </div>
        </div>

        <div class="row">
            <div class="editor-label">
                @Html.LabelFor(model => model.Email)
            </div>
            <div class="editor-field" style="margin-bottom: 15px">
                @Html.TextBoxFor(model => model.Email, new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Email)
            </div>
        </div>

....
Était-ce utile?

La solution

Comme vous pouvez voir dans votre dernière photo que vous avez une erreur sur la propriété SponsorOrgId qui a la chaîne de valeur.Vide ("").Peut-être que le SponsorOrgId dans ApplicationUser a l' [Échéant] attribut.

MODIFIER

Concernant votre problème lorsque vous essayez d'ajouter l'utilisateur à la Base de données (qui était arriver lorsque vous appelez UserManager.Créer(utilisateur,mot de passe);

IdentityResult result = await UserManager.CreateAsync(user, user.PasswordHash);
if (result.Succeeded)
{
    await db.SaveChangesAsync();
    return RedirectToAction("Index", "UserManagement");
}
else
{
    var errors = string.Join(",", result.Errors);
    ModelState.AddModelError("", errors);
}

Ensuite, vous pouvez déboguer la valeur des "erreurs" ou de lire le message d'erreur à partir de votre ModelState.

Concernant votre MODIFIER

Ajouter un nom à cette partie:

var user = new ApplicationUser() { UserName = applicationUser.UserName, Email = applicationUser.Email, PasswordHash = password, Name = applicationUser.Name };

EDIT 2 Le problème est que n'est pas possible de créer un utilisateur sans un nom d'utilisateur.Mais vous pouvez ajouter l'email de l'utilisateur le nom d'utilisateur.Et ensuite de le modifier pour l'utilisateur spécifié un nom d'utilisateur.Pour faire passer la validation, vous devez ajouter de la présente partie.

UserManager.UserValidator = new UserValidator<User>(UserManager) { RequireUniqueEmail = true };

Autres conseils

Je me rends compte qu'il est tard pour une réponse, mais j'ai lu les quatre fils sur ce avant de résoudre ce problème.Il n'est pas totalement évident, et il semble être un héritage des conflits avec les propriétés personnalisées.La racine de mon problème a été la création d'un nom d'utilisateur de la propriété une propriété personnalisée (...ou alors j'ai pensé) que je voulais définir comme Prenom + "" + Nom.

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
//    public new string UserName { get; set; }
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)

...remainder removed for clarity.

Dès que j'ai commenté cette ligne de IdentityModels.cs, qui a supprimé ma propriété personnalisée, POUF! Problème:résolu.J'ai percé l'héritage des définitions de tous le chemin du retour à IUser[TKey], et j'ai trouvé ce que je pense était à la racine de mon (notre) problème.

namespace Microsoft.AspNet.Identity
{
    // Summary:
    //     Minimal interface for a user with id and username
    //
    // Type parameters:
    //   TKey:
    public interface IUser<out TKey>
    {
    // Summary:
    //     Unique key for the user
    TKey Id { get; }
    //
    // Summary:
    //     Unique username
        string UserName { get; set; }
    }
}

Je savais que vous pourriez ajouter des propriétés personnalisées à l'ApplicationUser classe, mais je ne savais pas il y avait des noms de propriétés spécifiques déjà en cours d'utilisation - non défini dans la présente classe.D'abord, après l'ajout de mon champ nom d'utilisateur, simplement en tant que chaîne publique, j'ai reçu ceci:

[...] warning CS0114: 'MyApp.Models.ApplicationUser.UserName' hides inherited member 'Microsoft.AspNet.Identity.EntityFramework.IdentityUser<string,Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin,Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole,Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim>.UserName'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.

Je suis bon en suivant les instructions, j'ai donc ajouté le "nouveau" mot-clé (rappelez-vous que la ligne ci-dessus j'ai eu à commenter-out,...?).Il a résolu le moment de la compilation CS0114 avertissement, mais il obstrué IUser du nom d'utilisateur.

OP (et de nombreux autres) fait la même chose, je crois, lorsqu'il a écrit ceci:

var user = new ApplicationUser() { UserName = applicationUser.UserName, Email = applicationUser.Email, PasswordHash = password };

Si vous avez le nom d'utilisateur et propriétés de messagerie électronique dans votre applicationuser classe, ces propriétés se cachent propriétés, afin de les supprimer de votre classe d'application.Cela permettra de résoudre le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top