【问题标题】:InvalidOperationException: Could not create an instance of type 'Microsoft.AspNetCore.Http.HttpContext'InvalidOperationException:无法创建“Microsoft.AspNetCore.Http.HttpContext”类型的实例
【发布时间】:2020-05-10 19:10:58
【问题描述】:

当我尝试访问由布局记录的用户配置文件时,会出现此错误。我想查看特定用户的详细信息,对其进行编辑或删除,因此我需要将 id 发送到视图,我正在尝试在控制器中使用此功能:

public IActionResult PerfilSocio( HttpContext contexto,int? id)
{
    int x = Convert.ToInt32(contexto.Session.GetInt32("UserId"));

    if (id == x)
    {

        foreach (var item in _context.Socios)
        {
            if (item.Idsocio == x)
            {
                var y = item;
                return View(y);

            }
        }

    }
    else
    {
        return View("NaoEncontrado");
    }
    return View();
}

在我看来是这样的:

    @model WebApplication1.Models.Socios

@{
    ViewData["Title"] = "PerfilSocio";
}

<style>
    body {
        padding-top: 0px;
        background-color: gray;
        background-image: url();
        background-image: url();
        background-repeat: no-repeat;
    }
</style>
<h1 style="color:white;"> <b>LabGym</b> </h1>
<p style="text-align:right;color:white;">
    <i class="material-icons">&#9997;</i>
    <a href="~/Mensagems/VerMensagem"> Mensagens </a>
</p>
<br />

<div>

    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            @*@Html.DisplayNameFor(model => model.Fotografia)*@
        </dt>
        <dd class="col-sm-10">
            <img src="~/Fotos/ + model.Fotografia " />
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Email)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Email)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Telefone)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Telefone)
        </dd>

        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Sexo)
        </dt>
        <dd class="col-sm-10">
            @*@Html.DisplayFor(model => model.Sexo)*@
            @if (@Html.DisplayNameFor(model => model.Sexo) == "0")
            {
                <p>Feminino</p>
            }
            else
            {
                <p>Masculino</p>
            }
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Altura)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Altura)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.NomeUtilizador)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.NomeUtilizador)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.PesoInicial)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.PesoInicial)
        </dd>

        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Estado)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Estado)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Idsocio">Editar perfil</a> |

</div>
<br />
<br />
<br />
<br />

谁能帮我纠正这个错误?

InvalidOperationException:无法创建“Microsoft.AspNetCore.Http.HttpContext”类型的实例。模型绑定的复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。或者,给“contexto”参数一个非空的默认值。

【问题讨论】:

    标签: c# html asp.net-core


    【解决方案1】:

    不要在您的操作中接受 HttpContext 作为参数,而是这样做。

    public IActionResult PerfilSocio(int? id)
    {
        int x = Convert.ToInt32(HttpContext.Session.GetInt32("UserId"));
        if (id == x)
    

    HttpContext 只是 Controller 类向您公开的当前 HttpContext。

    如果尚未添加,则需要在 startup.cs 文件中进行以下更改

    在 ConfigureServices() 方法中添加相关服务。

    services.AddDistributedMemoryCache();
    services.AddSession();
    

    将 UseSession 作为第一个语句之一添加到 Configure() 方法。

    app.UseSession();
    

    【讨论】:

    • 您好,感谢您的回答,我按照指示进行了更正,它已经在工作,但它返回给我的视图是说找不到用户。他应该发送登录用户的 ID,以便查看他的个人资料和详细信息
    • 我该如何解决这个问题?我使用的是在数据库中注册的用户,并且“个人资料”字段仅在用户以合作伙伴身份登录时出现
    【解决方案2】:

    正如错误消息告诉您的那样,ASP.NET 将尝试对您的操作方法采用的任何参数进行建模(即从 URL 参数、HTTP 请求正文等映射它们)。

    HttpContext 类型是由 ASP.NET 核心基础结构本身设置的,因此您无法通过仅将其作为操作参数来访问它。如果您的控制器继承自 Controller 类,则 HttpContext 可用作其上的属性,因此您可以直接从您的操作方法中访问它:

    Convert.ToInt32(HttpContext.Session.GetInt32("UserId"))
    

    如果由于某种原因您没有从 Controller 类型继承,或者您想从控制器外部访问 HttpContext,那么您可以将 IHttpContextAccessor 注入到类中:

    private readonly IHttpContextAccessor httpContextAccessor;
    
    public MyController(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }
    
    public IActionResult PerfilSocio( HttpContext contexto,int? id)
    {
        int x = Convert.ToInt32(httpContextAccessor.HttpContext.Session.GetInt32("UserId"))
    

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 2021-10-24
      • 2018-05-25
      • 2021-11-15
      • 2021-10-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多