如何告诉控制器调用啥视图?

Posted

技术标签:

【中文标题】如何告诉控制器调用啥视图?【英文标题】:How to tell the controller what view to call?如何告诉控制器调用什么视图? 【发布时间】:2009-12-28 23:22:14 【问题描述】:

我的 Controller 类中有一个名为 handlePathChange() 的虚函数。 它会检查当前 URL,并应为其分配正确的视图。 这是我到目前为止的代码:

void Controller::handlePathChange()

    if ( app->internalPathMatches(basePath) )
    
        string path = app->internalPathNextPart(basePath);

        if ( path.empty() ) // If it's empty it is known that the index of the controller should show up
            index();
        // else if ( path == ?? ) each controller has it's own routes
        //   call_some_unknown_function();
    

如何概括这一点? 我在考虑两种选择:

    调用一个名为 dispatch() 的纯虚函数,它将匹配派生类中正确函数的正确路径。这种解决方案违反了 DRY,因为基本上你会一遍又一遍地编写相同的代码。 创建 std::function 的哈希映射,但如果 URL 的一部分是参数,则无法找到视图。所以这个选项还不够好。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我知道您的帖子使用了一个 c++ 示例,但如果您不介意阅读一些 c#,Scott Guthrie 的这篇文章很好地概述了 ASP.NET MVC 框架如何实现其路由:

http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

我想你会发现那篇文章很有帮助。在一种过于简化的方式中,它类似于您的选项 #2,但它总是检查参数。如果未提供该参数,则它使用相同的路由规则,但提供“默认”值并将请求发送到正确的视图。该策略避免了您提到的在指定参数时找不到合适视图的问题。

希望这会有所帮助。

【讨论】:

这里有个问题,因为C++缺少反射。我不能从字符串“index”中调用 index()。此外,我不能拥有一个包含不同长度参数的函数对象的异构容器? 啊,我明白了。除了您在 #1 和 #2 中建议的内容之外,不确定如何处理动态调用。但是,对于参数,您不能假设相同数量的参数然后只提供默认值吗?例如, - 解析 URL - 将预期操作标识为 URL 的第一/中间部分 - 如果提供了附加参数,则分配其他参数 - 否则,发送参数值的默认值?似乎使用这种方法,您的选项 #2 可能有效? 我已经开始写了。到目前为止,我正在使用参数的哈希映射(键:字符串,值:字符串),我的意思是如果它们与控制器或操作不匹配,则将其添加到参数中。现在我正在实施默认值。你将如何像在 ASP.Net MVC 中那样实现 setView? 据我了解(诚然粗略),在 ASP.NET MVC 中,控制器返回视图(技术上是 ViewResult,它派生自 ActionResult)。然后,管道在返回的对象上调用 ExecuteResult,这实质上是呈现页面输出。那么,根据您架构的其余部分,您也许可以做同样的事情?您是否能够使用界面上的某种渲染方法为所有视图定义一个通用界面?如果您正在构建一个 Web 框架,它可能还不错。如果你有一个 windows 应用程序,那么 render() 可能会更困难。 我正在为 C++ Web 框架编写 MVC 包装器。目前我正在返回视图,就像你说的那样,但我遇到了另一个问题。在视图中有小部件对吗?他们的每个事件都绑定到某些函数,如 onClick -> handleButtonClick(),而不是我希望它们重新路由到另一个操作,甚至可能是不同的控制器。它是如何在 ASP.Net MVC 中完成的?我接受你的答案是正确的,因为你让我朝着正确的方向前进。非常感谢。

以上是关于如何告诉控制器调用啥视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 segue 解压到调用它的视图控制器

如何从 extjs4.1 中的应用程序控制器调用视图

如何从控制器告诉 ASP.NET Core 视图存在?

从 TabBarClass 调用视图控制器方法

斯威夫特:我的班级的啥实例在视图中

在ios中点击后退按钮后调用啥方法