2014-10-02 78 views
4

我试图用个人帐户的MVC 5.2模板。除了当我试图删除用户的登录,我得到以下错误信息时,一切正常:无法删除用户外部登录

操作失败:关系无法更改,因为一个或多个外键属性是不可空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。

以下行ManagerController的

var result = await this.UserManager.RemoveLoginAsync(this.User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey)); 

这是完整的RemoveLogin行动:

[HttpPost] 
    [Route("RemoveLogin")] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey) 
    { 
     ManageMessageId? message; 
     var result = await this.UserManager.RemoveLoginAsync(this.User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey)); 
     if(result.Succeeded) 
     { 
      var user = await this.UserManager.FindByIdAsync(this.User.Identity.GetUserId()); 
      if(user != null) 
       await this.SignInAsync(user, isPersistent: false); 
      message = ManageMessageId.RemoveLoginSuccess; 
     } 
     else 
      message = ManageMessageId.Error; 

     return this.RedirectToAction("ManageLogins", new { Message = message }); 
    } 
+0

:本loginProvider和providerKey均为空。 – 2015-07-09 17:52:32

回答

0

我能够得到它通过改变线路工作:

public async Task<IActionResult> RemoveLogin(
    string loginProvider, 
    string providerKey) 

public async Task<IActionResult> RemoveLogin(
    [Bind(Prefix = "Account.LoginProvider")]string loginProvider, 
    [Bind(Prefix = "Account.ProviderKey")]string providerKey) 

原因:

无论出于何种原因,MVC结合并没有解决参数正确绑定:

<input asp-for="@account.LoginProvider" type="hidden" /> 
<input asp-for="@account.ProviderKey" type="hidden" /> 

是创造如下形式:

<input type="hidden" id="account_LoginProvider" name="account.LoginProvider" value="Facebook"> 
<input type="hidden" id="account_ProviderKey" name="account.ProviderKey" value="..."> 

这些名称没有绑定到参数名称loginProvider和providerKey。

下面是提供的解决方法了答案:我有同样的问题

https://stackoverflow.com/a/3869512/567524