Ошибка при использовании View и ViewData в проекте .NetCore 2.2 - - PullRequest
0 голосов
/ 10 июля 2020

быстрый вопрос. Я получаю следующую ошибку при попытке вернуть представление из моего метода контроллера.

Имя View не существует в текущем контексте

см. Это pi c, чтобы понять структуру моего проекта - https://pasteboard.co/Jh1AxGy.png

Мой код

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using AutoMapper;
    using Microsoft.AspNetCore.Identity;
    using Microsoft.AspNetCore.Authorization;
    using CoreSpeechService.App.Utility;

    public IActionResult ProductInfo(int p_id)
    {
        if(p_id>0)
        {
            var pEntity = pService.GetProductById(p_id);
            if(pEntity!=null)
            {
                ViewData["ProductId"] = pEntity.Id;
                return View(pEntity);
            }
            else
            {
                return RedirectToAction("Index");
            }
        }
        else
        {
            return BadRequest("Could not fetch detailes related to this product at the moment. Please try later.");
        }
    }

Казалось бы, я добавил все необходимые пространства имен в контроллер . Очевидно нет. У меня есть подозрение, что это в основном связано со структурой моего проекта [контроллер и файлы cs html]. Проблема с правильными лесами? Что делать?

Предложения. Спасибо

** стоит упомянуть - мой контроллер унаследован от ControllerBase, а не от Controller.

1 Ответ

1 голос
/ 14 июля 2020

Имя View не существует в текущем контексте

Это потому, что ваш контроллер наследуется от ControllerBase. Вы можете проверить исходный код ниже, ControllerBase не содержит View() метод по умолчанию. Controller наследуется от ControllerBase и добавляет поддержку представления:

//A base class for an MVC controller with view support.
public abstract class Controller : ControllerBase, IActionFilter, IFilterMetadata, IAsyncActionFilter, IDisposable
{
    protected Controller();
     
    // Summary:
    //     Creates a Microsoft.AspNetCore.Mvc.ViewResult object that renders a view to the
    //     response.
    //
    // Returns:
    //     The created Microsoft.AspNetCore.Mvc.ViewResult object for the response.
    [NonAction]
    public virtual ViewResult View();
    //
    // Summary:
    //     Creates a Microsoft.AspNetCore.Mvc.ViewResult object by specifying a viewName.
    //
    // Parameters:
    //   viewName:
    //     The name or path of the view that is rendered to the response.
    //
    // Returns:
    //     The created Microsoft.AspNetCore.Mvc.ViewResult object for the response.
    [NonAction]
    public virtual ViewResult View(string viewName);
    //
    // Summary:
    //     Creates a Microsoft.AspNetCore.Mvc.ViewResult object by specifying a viewName
    //     and the model to be rendered by the view.
    //
    // Parameters:
    //   viewName:
    //     The name or path of the view that is rendered to the response.
    //
    //   model:
    //     The model that is rendered by the view.
    //
    // Returns:
    //     The created Microsoft.AspNetCore.Mvc.ViewResult object for the response.
    [NonAction]
    public virtual ViewResult View(string viewName, object model);
    //
    // Summary:
    //     Creates a Microsoft.AspNetCore.Mvc.ViewResult object by specifying a model to
    //     be rendered by the view.
    //
    // Parameters:
    //   model:
    //     The model that is rendered by the view.
    //
    // Returns:
    //     The created Microsoft.AspNetCore.Mvc.ViewResult object for the response.
    [NonAction]
    public virtual ViewResult View(object model);       
}

В таком сценарии просто измените ControllerBase на Controller:

public class ProductController : Controller { }

Кроме того, я вижу, что ваша структура содержит Razor Pages. Когда вы используете return View(model), она будет отображать бритвенное представление с данными модели. Убедитесь, что у вас есть бритвенное представление с именем ProductInfo.cshtml вместо бритвенных страниц с именем ProductInfo.cshtml .

...