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 });
    }
4

1 回答 1

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

于 2015-07-09T18:13:31.317 回答