【问题标题】:asp.net mvc how it decides which view to loadasp.net mvc 如何决定加载哪个视图
【发布时间】:2010-08-24 14:06:10
【问题描述】:

我正在尝试构建一个 asp.net mvc 应用程序,它将使用以下网址:

/Controller/[编号]/Action/Id

我让它总是调用我的控制器并将NumberId 传递给它... 但是我现在想根据Number 返回不同的视图 我可以有如下选择:

if([Number] == 1) { return View("ViewName");}
if([Number] == 2) { return View("ViewName2");}

然而,我想知道是否有办法改变核​​心,而不是在 ~/Views/controller/action.aspx 上搜索,我可以有自己的方法,对 Number 进行一些检查,然后传递给虚拟文件提供程序是不同的路径

希望这是有道理的!

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    根据输入参数决定加载哪个视图是一个控制器任务。您可以编写自己的视图引擎。

    但是将完整路径返回到要返回的视图会更容易。

    return View("~/myviews/ViewName3.aspx");
    

    这将从给定目录呈现 ViewName3。

    【讨论】:

      【解决方案2】:

      你可能想看看用动作过滤器属性装饰你的控制器方法。

      然后,您可以在动作过滤器属性中做一些特别的事情。

      或者,您可以将 Number 传递给模型对象,然后让模型对象返回正确的视图路径。

      无论哪种方式,您试图将过多逻辑排除在 Controller 之外的本能是合理的,尤其是如果 [Number] 在某种程度上是一个业务问题而不是视图问题。

      【讨论】:

      • 嗨,您所说的操作属性是什么意思? Number 将是一个 db 查找...我将根据 Action 和 [Number] 从 db 加载视图
      • 对不起,这是动作过滤器属性。在此处阅读它们:asp.net/mvc/tutorials/understanding-action-filters-cs 您可以完全访问 Action Filter Attribute 方法中的 Context。你应该可以在那里做任何事情。我过去在那里在对象级别完成了自定义安全性。虽然,这对你的情况来说可能有点过头了,但值得一看。
      【解决方案3】:

      您需要查看/google 创建自定义视图引擎。

      您可能只是想扩展内置的 WebFormViewEngine 并覆盖位置和 .FindView() 方法。

      HTH,
      查尔斯

      【讨论】:

      • 嗨试过了,但问题是我不只是更改搜索路径,而是从数据库中加载视图...如何从字符串创建 IView...
      • 嗯??你没有提到从数据库加载视图的任何事情......事实上,你说“我可以有我自己的方法来检查数字然后传递给虚拟文件提供程序是不同的路径”但现在你'正在改变你的曲调,你想从数据库中获取它?
      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2011-03-31
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      相关资源
      最近更新 更多