从服务器端调用Javascript代码是一个好习惯吗?

时间:2016-09-09 21:50:59

标签: javascript c# asp.net-mvc

我正在使用一些传统的Asp.Net MVC项目,在一些控制器中查找返回javascript调用的操作非常常见。例如:

[HttpPost]
public async Task<ActionResult> Create(string code)
{
    var result = await _repository.CreateFromCode(code);
    if(result > 0)
        return JavaScript("DoSuccessLogic(" + result + ");");
    else
    {
        ModelState.AddModelError("Code", "Wrong code specified. Please enter a valid code");
        return PartialView(code);
    }
}

这种从服务器调用客户端代码的想法对我来说看起来很尴尬,实际上它闻起来像一个反模式。我假设System.Web.Mvc.JavaScript方法已被添加到MVC框架中以处理非常具体的情况,但它的用法可能不太鼓励;特别是在像这样的情况下,可以使用Json方法代替并在客户端完全从onSuccess处理程序或类似的东西处理动作的后果。

但是我不确定并且没有说服其他人改变它的论据。

所以问题是:

  1. 这真的是一种应该避免的反模式吗?
  2. 如果是,为什么?

2 个答案:

答案 0 :(得分:2)

1)是的,我认为它可以被称为反模式

2)一般来说,广泛使用不是很好的做法。

JavaScript(...)方法返回 JavaScriptResult 。确实 JavaScriptResult ContentResult 相同,但 JavaScriptResult 被硬编码以返回内容类型标题 application / 响应中的x-javascript

您应该考虑使用 JavaScript(...),就像将SQL命令注入C#代码一样,这是一种令人不安的技术冲突。我将尝试描述这种方法的利弊。

<强>优点

  • 允许实现快速小功能(例如修改DOM),这些功能不需要大量的JS代码。

<强>缺点

  • 使代码变得脆弱
  • 使代码无法阅读
  • 当您通过串联C#字符串创建JS代码时,您没有 JS语法突出显示
  • 将服务器端代码紧密耦合到客户端代码。

答案 1 :(得分:0)

我不知道我会把它称为反模式。看起来这个功能可能会向客户推送一些东西,但很难从提供的代码片段中分辨出来。在某些情况下,数据会被推送到客户端,但我认为通常不会这样做。

有些问题可以帮助您确定代码的可持续性/可维护性:

  1. 如何测试DoSuccessLogic(...)
  2. DoSuccessLogic(...)做什么不能在C#中完成?
  3. DoSuccessLogic(...)是否向客户推送了一些东西?