【问题标题】:How to add View routing in a .net core project?如何在 .net 核心项目中添加视图路由?
【发布时间】:2017-02-27 22:00:31
【问题描述】:

我创建了一个.Net Core Web API 程序。我想向它添加一个视图。在同一个项目下,我添加了一个“视图”文件夹。在我路由所有 API 请求的 HomeController 中,我创建了以下内容:

[HttpGet("view")]
    public IActionResult Index()
    {
        return View();
    }

在我的 Views 文件夹中,我创建了一个文件夹“Home”并向其中添加了“Index.cshtml”。

当我启动 API 并导航到“../view”时,我到达 return View(); 行,但随后它返回 500 Internal Server Error。

这是我不喜欢 MVC 约定的“自动”方法的地方。如果约定不起作用,我不知道在哪里将视图链接到控制器。

更新,这可能应该是我的第一个行动方案。 我在 Controllers 文件夹中添加了一个新类,并在 VS2015 中使用了 MVC Controller 模板。然后我添加了一个视图来匹配,它仍然不能自动工作。

所以为了清楚起见,我的项目是:ASP.NET Core Web Application(.NET Core)Web API 模板。我有一个“作业”控制器类,它在开始时添加为“值”,然后我重命名了。然后我添加了一个名为“HomeController”的MVC Controller Class,唯一的方法是“Index”。我添加了一个名为“Views”的文件夹和一个名为“Home”的子文件夹,并添加了一个名为“Index.cshtml”的MVC View Page

我尝试使用“return View();”在 Index 方法中,没有用。然后我尝试在 Index 方法上方添加 [Route("Home/Index")] 。无论哪种方式,该 URL 都会让我到达“return View();”处的断点。但它永远不会返回视图。

【问题讨论】:

  • “自动”方法稍难学习,但好处是您需要维护的代码要少得多,因为应用程序是由约定驱动的。我不确定这是否确实适用于 .NET 核心,但在以前的版本中,您永远不会从 WebAPI 控制器返回视图 - 视图严格用于 MVC。 WebAPI 期望您返回某种数据结构,最终将 XML 或 JSON 生成给消费应用程序,而不是视图。
  • @NightOwl888 我明白,我知道我不应该那样做,如果你阅读我的更新,你会看到我添加了一个 MVC 控制器,但它仍然无法工作。跨度>
  • 你能显示你的 index.cshtml 的内容吗?
  • 看我的回答,别忘了控制器上的[Route("")]
  • 您应该实现异常日志记录以了解您的应用程序发生了哪些异常;)

标签: c# asp.net-mvc asp.net-core .net-core


【解决方案1】:

注意:你想在Web API项目中返回一个视图有点奇怪,一个Web API项目应该返回一些数据结构,比如json使用return new JsonResult (your_json_here) 例如。

注意 2:您需要 Microsoft.AspNetCore.Mvc 框架(随 Web API 模板一起安装)

无论如何,在 asp.net 核心应用程序中配置路由有不同的方法:

  • 创建和扩展默认路由

Configure方法中的路由配置示例:

app.UseMvc(routes =>
{
           // You can add all the routes you need here

           // And the default route :
           routes.MapRoute(
                name: "default_route",
                template: "{controller}/{action}/{id?}",
                defaults: new { controller = "Home", action = "Index" }
           );
});
  • 使用属性

如果你用属性配置路由,别忘了控制器的那个:

路由示例/index

[Route("")]
public class HomeController : Controller
{
     [HttpGet]
     [Route("[action]")]
     public IActionResult Index()
     {
        return View();
     }
}

/home/index 路径示例:

[Route("[controller]")]
public class HomeController : Controller
{
     [HttpGet]
     [Route("[action]")]
     public IActionResult Index()
     {
        return View();
     }
}

路线示例/iputwhatiwant/actionnameiwant

[Route("iputwhatiwant")]
public class HomeController : Controller
{
     [HttpGet]
     [Route("actionnameiwant")]
     public IActionResult Index()
     {
        return View();
     }
}

我的 .NET Core Web API 项目屏幕返回一个视图:

欲了解更多信息,官方文档有据可查:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing

【讨论】:

  • 我真的只是想添加一个主页,其中列出了我拥有的所有 API。我实际上并没有试图让它成为一个完整的 MVC 网页。我想我只部署过 MVC 页面,所以我不知道如何在这个 API 程序中设置默认的 html 主页。我试图使用我从 API 中获得的“路由”知识和命名控制器/视图的约定来完成这项工作。无论哪种方式,我都没有问题得到我的Return View() 声明。它实际上不会满足这种观点。我已将Use.Mvc(routes => 添加到我的启动文件中。但这并没有解决问题。
【解决方案2】:

你是如何从 Windows 命令行运行这个 web 应用程序的?...你能给我们详细的 HTTP500 错误吗?它可能会显示与路由错误不同的东西,因为这通常会给出 404。

[Route("[controller]")]
public class HomeController : Controller

注意 Route 定义中的自动“[控制器]”,我认为它现在是必要的

【讨论】:

    【解决方案3】:

    在开发路由约定的过程中,我花了很长时间才了解它,但它似乎已经针对几个版本进行了规范化。在 MVC 中查看有关该主题的本教程文档:Attribute Routing in ASP.NET MVC 5,它可能是 MVC 而不是 WebCoreAPI。如果您有更好的特定于 Web Core API 的文档,请使用它。

    这个ASP.NET Web Core Build a web API 教程文档有一些关于您似乎正在尝试做的事情的要点。具体来说,标题“获取待办事项”的部分代码如下:

    [HttpGet("{id}", Name = "GetTodo")]
    public IActionResult GetById(long id)
    {
        var item = _todoRepository.Find(id);
        if (item == null)
        {
            return NotFound();
        }
        return new ObjectResult(item);
    }
    

    从一些 MVC 路由经验的角度来看,它看起来与您的方法特别不同,因为使用的 HTTP 动词注释成员属性值是一个查询参数。

    看到我猜测使用已知的不专业,但我认为您需要修复属性路由,并且可能返回 ObjectResult 而不是视图,正如 NightOwl888 建议的那样。服务器错误可能还包含更多有用的信息以及异常消息。

    编辑:对不起,我可能误解了你的问题。如果您尝试构建一个提供动态网页的应用程序,而不是提供数据对象结果的 WebAPI,这个Build an MVC Web App 教程,类似于我之前提到的“构建 Web API”教程,可能会为您提供应用程序结构问题的答案。如果您尝试两者,您可能应该从 MVC Web App 结构开始或使用两个单独的项目。

    【讨论】:

      【解决方案4】:

      我得到这个工作的(唯一)方法是将路径声明为动作的属性 - 与您所做的相同,但格式如下(控制器/动作):

      [HttpGet("Home/Index")]
      public IActionResult Index()
      {
          return View();
      }
      

      【讨论】:

        【解决方案5】:

        我不见了:

        "preserveCompilationContext": true

        在我的 project.json 的构建选项中

        【讨论】:

          猜你喜欢
          • 2022-06-12
          • 1970-01-01
          • 2018-08-09
          • 1970-01-01
          • 1970-01-01
          • 2018-10-06
          • 2018-01-23
          • 2023-03-12
          • 1970-01-01
          相关资源
          最近更新 更多