如何在 .net core 项目中添加视图路由?

3
我已经创建了一个 .Net Core Web API 程序。我想要添加一个单独的视图。在同一个项目下添加一个 "Views" 文件夹。在 HomeController 中,我将所有的 API 请求都路由到这里,我创建了以下内容:
[HttpGet("view")]
    public IActionResult Index()
    {
        return View();
    }

在我的Views文件夹中,我创建了一个名为“Home”的文件夹,并在其中添加了“Index.cshtml”。
当我启动API并导航到“../view”时,我到达了“return View();”行,但是然后它返回500内部服务器错误。
这就是我不喜欢MVC约定的“自动化”方法的原因。如果约定不起作用,我不知道在哪里将视图链接到控制器。
更新,这可能应该是我的第一步行动。我向Controllers文件夹添加了一个新类,并在VS2015中使用了MVC Controller模板。然后我添加了一个匹配的视图,但自动化仍然不起作用。
因此,为了明确,我的项目是:ASP.NET Core Web应用程序(.NET Core)具有Web API模板。我有一个“Jobs”控制器类,它在开始时被添加为'Values'并进行了重命名。然后我添加了一个名为“HomeController”的MVC控制器类,其唯一方法是“Index”。我添加了一个名为“Views”的文件夹和一个名为“Home”的子文件夹,并添加了一个名为“Index.cshtml”的MVC视图页面。
我尝试在Index方法中使用“return View();”,但不起作用。然后我尝试在Index方法上方添加[Route(“Home / Index”)]。无论哪种方式,URL都会将我带到“return View();”处的断点,但它永远不会返回视图。

1
"Automagical"的方法稍微难学一点,但收益在于你要维护的代码量少得多,因为应用程序是由约定驱动的。我不确定这是否适用于.NET Core,但在之前的版本中,您永远不会从WebAPI控制器返回View——View严格用于MVC。WebAPI期望您返回某种数据结构,最终将以XML或JSON形式传送到使用的应用程序,而不是View。 - NightOwl888
@NightOwl888 我明白了,我知道我不应该那样做,如果你看了我的更新,你会发现我添加了一个MVC控制器,但它仍然无法工作。 - Steve Eggering
你能展示一下你的 index.cshtml 文件内容吗? - AdrienTorris
看一下我的答案,别忘了在控制器上加上 [Route("")]。 - AdrienTorris
你应该实现异常日志记录,以了解应用程序发生了哪些异常 ;) - AdrienTorris
5个回答

5

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

注意2: 您需要安装Microsoft.AspNetCore.Mvc框架(这个框架已经在Web API模板中安装)。

无论如何,在asp.net core应用程序中配置路由的方法有很多种:

  • 创建和扩展默认路由

下面是一个在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项目的开发,返回一个视图的屏幕截图如下:

My screen of a .NET Core Web API project returning a view

如果需要更多信息,请参考官方文档:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing


我只是想添加一个主页,列出我拥有的所有API。我并不打算让它成为一个完整的MVC网页。我想我之前只部署过MVC页面,所以我不知道如何在这个API程序中设置默认的HTML主页。我试图使用我从API中了解到的“路由”知识和命名控制器/视图的约定来使其工作。无论如何,我没有问题到达我的Return View()语句。它只是无法提供该视图。我已经将Use.Mvc(routes =>添加到我的启动文件中。但那并没有解决问题。 - Steve Eggering

1
我花费了很长时间才学会路由约定,但它似乎已经在几个版本中得到了规范化。在MVC中查看有关此主题的教程文档:ASP.NET MVC 5中的属性路由,这是MVC而不是WebCoreAPI,但可能是基于它的。如果您有更好的特定于Web Core API的文档,请使用该文档。
ASP.NET Web Core 构建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动词注释成员属性值是一个查询参数。

考虑到我猜测您使用的是已知的不熟练技巧,我认为您需要修复属性路由,也许像NightOwl888建议的那样返回一个ObjectResult而不是视图。服务器错误可能还会提供更有用的信息以及异常消息。

编辑:抱歉,我可能误解了您的问题。如果您正在尝试构建一个提供动态网页而不是提供数据对象结果的WebAPI应用程序,则类似于我之前提到的“构建Web API”教程的构建MVC Web应用程序教程可能有助于解决您的应用程序结构问题。如果您想要同时做这两件事,您应该从MVC Web应用程序结构开始或者使用两个单独的项目。


1
你是如何运行这个Web应用程序的,从Windows命令行吗?能否给我们提供详细的HTTP500错误信息。这可能会显示与路由错误不同的内容,因为通常会显示404。
[Route("[controller]")]
public class HomeController : Controller

注意路由定义中的自动化“[controller]”,我认为现在它是必要的。

0
我错过了:
在我的 project.json 的生成选项中,缺少以下代码: "preserveCompilationContext": true

0
我唯一让它工作的方法是在操作上声明路径作为属性 - 就像你所做的那样,但格式如下(控制器/操作):
[HttpGet("Home/Index")]
public IActionResult Index()
{
    return View();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接