2009-05-06 21 views
6

En mi aplicación tengo una función de administrador, y este tipo de usuarios pueden cambiar la función de un usuario (cliente, gerente ...). Estoy usando el proveedor integrado de Membresía. Esto es lo que traté de hacer ...ASP .NET MVC: ¿Cómo puedo cambiar el rol de un usuario?

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult EditRole(string usernameID, FormCollection formValues) 
    { 

     var db = new AppDataContext(); 
     var user = db.Users.SingleOrDefault(d => d.UserName == usernameID); 
     string choosenRole = Request.Form["Roles"];        

     var tuple = db.UsersInRoles.SingleOrDefault(d => d.UserId == user.UserId); 
     var roleNameID = db.Roles.SingleOrDefault(d => d.RoleName == choosenRole).RoleId; 
     tuple.RoleId = roleNameID; 

     db.SubmitChanges(); 

     return RedirectToAction("Index"); 
    } 

Pero, tengo este error ..

Valor del miembro RoleId 'de un objeto de tipo 'UsersInRole' cambiado. Un miembro que define la identidad del objeto no se puede cambiar. Considere agregar un nuevo objeto con nueva identidad y eliminar el existente en su lugar.

Estoy sorprendido. ¿Algunas ideas?

+0

¿está utilizando el proveedor integrado de Membresía o administrando usuarios/roles usted mismo? –

+0

Gracias, lo he editado ya – wallyqs

Respuesta

9

lugar de tratar de acceder a las tablas de miembros directamente del db (DataContext) usted debe utilizar los User, Roles y Membership clases estáticas proporcionadas dentro de su código de acción allí.

De esta manera:

System.Web.Security.Roles.AddUserToRole(usernameID, choosenRole); 

Suponiendo que su usernameID es la clave de cadena del usuario que desea cambiar y choosenRole contiene la clave del nombre de la función que desea agregar al usuario:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditRole(string usernameID, FormCollection formValues) 
{ 
    string choosenRole = Request.Form["Roles"];        
    System.Web.Security.Roles.AddUserToRole(usernameID, choosenRole); 

    return RedirectToAction("Index"); 
} 
+0

Lo siento, no lo conseguí. Gracias por el comentario. – wallyqs

+0

¡Gracias! No sabía sobre esto. Eso lo hizo! – wallyqs

0

UsersInRole.RoleId es parte de la clave principal de la tabla UsersInRole y, por lo tanto, no se puede cambiar. Debe seguir la sugerencia dada por el mensaje de error y eliminar la instancia existente UsersInRole y crear una nueva.

+0

Entonces, ¿no es posible y tengo que reconstruir la membresía del usuario? – wallyqs

+0

Sí, no es posible. De modo que podría eliminar y crear una nueva instancia de UsersInRole o seguir la sugerencia de cottsak (use las clases de Membresía). –

Cuestiones relacionadas