【问题标题】:Classifying routes based on url parameter name in Asp.net Core在 Asp.net Core 中根据 url 参数名称对路由进行分类
【发布时间】:2020-04-07 14:30:08
【问题描述】:

我有 2 个页面可以通过这些操作访问:

public class SearchEngineController : Controller
{
    [Route("/search/{k}")]
    public IActionResult Search(string k = "")
    {
        return View();
    }
}

public class ChannelController : Controller
{
    [Route("{name}")]
    public IActionResult Index(string name = "")
    {
        return View();
    }
}

现在,当我使用键 (somekey) 搜索内容时,我想重定向到 url localhost:5000/search?k=somekey

因为我们使用的是频道(比如 Youtube 的频道),所以我们需要对频道名称进行分类,它应该是唯一的。例如,名称为mobifone 的频道可以通过localhost:5000/mobifone 访问。

在调用搜索请求时,直到 name 参数(在 Index 操作内)无法分类之前,一切可能看起来都不错。所以,每次我输入localhost:5000/search?k=somekey,它都会触发Index 动作。

所以,我的临时解决方案如下:

public class ChannelController : Controller
{
    [Route("{name}")]
    public IActionResult Index(string name = "")
    {
        if (name.ToLower() == "search")
        {
            // ~/Views/Shared/Search.cshtml
            return View("Search");
        }

        return View();
    }
}

可以解决问题但是....我不喜欢它。因为我不想在ChannelController 中嵌套和执行搜索查询。它不是频道的一部分。一个频道可能包含:

- Id
- Name
- DisplayName
- FounderId
- ...

在中间件中,_channelManager 不应该有一个搜索引擎成员可以返回世界上的一切,例如:

- Channel information
- List of channels
- User profile
- A post content
- List of posts
- ...

有没有比我更好的方法?

【问题讨论】:

  • 从 `[Route("/search/{k}")]` 中删除 /{k} 时对我有用

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


【解决方案1】:

问题是您实际上并没有使用正确的路线。您已将搜索路线定义为“/search/{k}”,这意味着您需要类似/search/somekey 的内容才能真正找到它。您请求的是/search?k=somekey,它与搜索路线不匹配,很可能只是退回到您的默认路线,而这恰好是ChannelController.Index 操作。如果您想通过查询字符串传递k 参数,则应将其从路由定义中删除,即[Route("/search")]

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
相关资源
最近更新 更多