从MVC调用Javascript的标准实践

本文关键字:标准 Javascript MVC 调用 | 更新日期: 2023-09-27 18:20:12

我对Web窗体很有经验,但尝试在MVC中创建一个网站以拓宽我的技能。在Web窗体中,当页面加载时,您可以执行这样的操作来执行一些JavaScript:

ScriptManager.RegisterStartupScript(this, this.GetType(), "unique-script-id", "alert('Data saved.');", true);

从控制器执行此操作的等效方法是什么?我应该在ViewBag中传递一个JavaScript块,然后在我的View中检查该脚本的存在并渲染它吗?还是应该放弃在控制器上执行此操作的想法,而是从客户端使用AJAX将表单发布到Web API,然后根据HTTP状态代码显示适当的消息?

public ActionResult Submit(ArticleModel article)
{
    //save model to database
    //I think here I want to do the MVC equivalent of registering a startup script providing a success message.
    return RedirectToAction("Index");
}

从MVC调用Javascript的标准实践

从控制器执行此操作的等效方法是什么?

你没有。无论如何都不是来自控制器。

JavaScript是视图的一部分。控制器为视图提供了一个模型,仅此而已。它不应该以任何方式与视图耦合。您的JavaScript将在视图中调用。

如果您希望有条件地在视图中包含JavaScript,您可以将其封装在对模型属性的条件检查中:

@if(Model.SomeBooleanProperty)
{
    <script type="text/javascript">
      // your script here
    </script>
}

然后,模型将从逻辑上确定是否调用该功能。视图只是绑定到模型上的属性。

编辑:另一种方法是使用类似ViewBag的东西,结构相似,但不向模型添加属性。在你的控制器中,你可以设置值:

ViewBag.SomeBooleanProperty = true;

然后你可以在视图中查看:

@if(ViewBag.SomeBooleanProperty)
{
    <script type="text/javascript">
      // your script here
    </script>
}

但是,请记住,这在控制器和视图之间引入了一些耦合。视图现在假设已经设置了模型以外的其他内容。然后,返回该视图的任何代码都有责任显式设置该值。模型是一种更明确地实现这一点的方法,消除了耦合。

此外,你在一条评论中似乎误解了一些东西:

我所说的这些信息不是数据,因此不属于模型。

模型不包含,只包含数据。模型包含应用程序的核心业务逻辑仅数据会导致"贫血模型"。

从长远来看,学习"MVC方式"将帮助您开发更多模块化、可测试的应用程序。

在您的示例中,您将围绕多个组件封装您的功能。您希望控制器告诉视图执行某些操作。这是MVC框架通常努力偏离的做法。

MVC框架,包括ASP.NET MVC,都遵循责任最小的原则。

控制器的工作是控制应用程序流。它甚至不真正负责程序逻辑,你可能需要服务来处理数据库管理、复杂计算等问题。你的控制器不应该真正关心视图,也不应该关心视图如何显示信息;它应该只关心如何提出观点,并告诉观点去做它自己的事情。通常,除了极其复杂的场景外,控制器可以精简到不到10行代码。

同样,视图不应该关心控制器的工作方式或控制器响应的服务。永远不应该告诉视图如何显示信息、错误等,只告诉视图要处理的数据或状态。

保持这种关注点的分离意味着几件事。首先,它确保您可以对应用程序的一部分进行更改,而不会对另一部分产生重大影响。其次,您可以在没有视图的情况下测试控制器是否工作,也可以在没有功能控制器的情况下使用示例信息渲染视图。这使您的开发团队更加高效。

最重要的是,在使用MVC时,你应该把关注点分离的想法放在脑海中,如果你曾经认为你需要让你的控制器告诉视图来显示一些东西,那么你的整体架构可能走错了方向。

嗯。。您可以直接在CSHTML中使用javaScript,如果您想在条件下显示您的脚本,则可以将其绑定到内部,如果条件只是从控制器传递一个信号以仅显示脚本
truefalse
示例
从控制器设置一个布尔值并保存在ViewBag 中

ViewBag.isSubmit= true;  

然后在您的视图中检查条件

@if ((bool)ViewBag.isSubmit==true)
{
    <script>  
          alert('Submit Successfully');  
    </script>
}

但请记住在if之前插入@,因为这是CSHTML并且使用Razor语法。