【问题标题】:Generate view without controller action在没有控制器操作的情况下生成视图
【发布时间】:2017-11-27 09:00:02
【问题描述】:

在我的 ASP.NET MVC 项目中,我有一个控制器,一个动作就是结果视图。此操作不获取任何参数,只返回一个 CSHTML 页面。此页面不能是局部的。

有人知道生成视图的更好方法吗?我的意思是我可以在没有控制器操作的情况下生成视图吗?

//编辑 - 示例代码

现在在我的 UserPanelController 我有一个动作 ChangeSettings

[HttpGet]
public ActionResult ChangeSettings()
{
    return View("Configuration");
}

因此,如果我想获得配置视图,我必须从例如导航向控制器发出请求:

<nav>
     <div class="nav-wrapper">
       <a href="#" class="brand-logo">Logo</a>
       <ul id="nav-mobile" class="right hide-on-med-and-down">
            <li><a href="sass.html">Sass</a></li>
            <li><a href="badges.html">Components</a></li>
            <li><a href="@Url.Action("ChangeSettings","UserPanel")">Konrad</a></li>
       </ul>
     </div>
</nav>

我可以在没有控制器操作的情况下获得 ConfigurationView 吗?

【问题讨论】:

  • “生成没有控制器操作的视图”是什么意思
  • 您能否提供您的示例代码,并请澄清您的问题?第一句话,结尾“that one action just result view”不是英文的,猜不到是什么意思。
  • 更多信息在主帖中 - 抱歉没有样品
  • 如果你需要动态渲染视图,它必须通过一个MVC动作。

标签: c# asp.net asp.net-mvc razor asp.net-mvc-controller


【解决方案1】:

也许我有点太晚了,但您可能正在寻找的是:

 @{ Html.RenderPartial("_PartialViewName"); }

请注意,您也可以在视图中使用模型,方法是直接从调用局部模型的视图传递模型。

【讨论】:

    【解决方案2】:

    您可以通过调用以下方法自己渲染视图

     private static string RenderPartialViewToString(Controller controller, string viewName, object model)
        {
    
            controller.ViewData.Model = model;
    
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
    
                var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
    
                return sw.ToString();
            }
        }
    

    这将为您提供包含渲染视图的 html 字符串。我以前用它来为电子邮件内容从一个用户更改为另一个用户的电子邮件呈现 HTML。

    希望这会有所帮助。

    【讨论】:

    • 如果该电子邮件模板没有控制器怎么办?
    【解决方案3】:

    如果是静态内容,可以在项目中添加.html文件。网络服务器将为它提供服务。

    为了确保 MVC 路由不会干扰,您可以在路由中添加类似这样的内容:

    routes.IgnoreRoute("{file}.html");
    

    【讨论】:

    • 但在静态 html 文件中我无法获取当前用户名等信息
    • 不,完全正确。我描述的方法只能用于静态内容。否则你必须在控制器中创建一个动作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多