【问题标题】:How to pass value from partial view to shared view _Layout.cshtml in asp.net MVC?如何在asp.net MVC中将值从局部视图传递到共享视图_Layout.cshtml?
【发布时间】:2016-12-15 18:31:18
【问题描述】:

有一个控制器可以捕获异常。我想将错误消息传递给 _Layout.cshtml 中的通用 javascript,以便应用于所有页面。如果将值从普通视图传递到 _Layout.cshtml ,则完全可以找到,例如@ViewBag = "错误信息";在视图中或 ViewBag.ErrorMessage = "错误信息";在控制器中,但在局部视图中不起作用。

我应该怎么做才能将字符串消息从局部视图传递到_Layout.cshtml??

【问题讨论】:

  • 你想在什么事件上传递值?在页面加载?
  • ViewBag 应该可以在布局文件中访问,您能否发布一些代码来展示您尝试过的内容?

标签: c# asp.net asp.net-mvc partial-views viewbag


【解决方案1】:

不确定您到底要做什么。但是您可以在局部视图中放置一个脚本块,该脚本块在渲染后运行全局 javascript 函数,可能包含消息或其他数据。

例如在 _Layout 你有:

<script>
    function ShowError(message) {
        alert(message);
    }
</script>

然后在你的部分中你有:

<script>
 // check for existence of error and if so
 ShowError(ErrorMessage);
</script>

【讨论】:

  • 大多数情况下Partial View 不要使用_Layout file。所以这个解决方案效率不高...
  • @mmushtaq 但它特别在问题中。
  • @mmushtaq 如果我想将警报功能全局应用于所有局部视图,除了使用 _Layout 文件还有其他解决方案吗?
【解决方案2】:

如果您想在同一请求期间将数据从局部视图传递到其布局,您可以通过 ViewBag 对象来实现:

部分视图文件

@{
ViewBag.ErrorMessage = "error message";
}

_布局文件

@if (ViewBag.ErrorMessage != null)
{
    <script>
    alert(@ViewBag.ErrorMessage);
    </script>
}

如果您想在控制器的操作中捕获异常,然后在重定向时传递错误消息,您可以使用TempData

控制器

public ActionResult SomeAction(){
...
try{
  ....
}catch(Exception e){
  TempData["errorMessage"] = e.Message;
  return RedirectToAction("MaybeSomeOtherAction");
}
...
}

“MaybeSomeOtherAction”的_layout 文件

@if (TempData["errorMessage"] != null)
{
    <script>
    alert(@TempData["errorMessage"]);
    </script>
}

【讨论】:

    【解决方案3】:

    为错误创建一个公共属性;

     public static class Common
        {
            public static bool ERROR {get;set;}
        }
    

    如果抛出异常或显示错误消息,请将此属性设置为 true;

    try
    {
       //Any Code
    }
    catch(Exception)
    {
       Common.ERROR = true;
       return PartialView("_PartialView");
    
    }
    

    在您的 _Layou 文件、视图或 _Partial View 中,您可以在 Document.Ready 检查此属性,如果为真,则您可以显示错误警报。

    $(function(){               
             if(@Html.Raw(Json.Encode(@HelloWorldMvcApp.Common.ERROR)))
             {
                    alert("error message");
                        return;
            }
    })
    


    Demo if this property is True

    Demo if it is False or its value is not set to true

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      相关资源
      最近更新 更多