在控制器外部将视图呈现为字符串的首选方法中的哪一种?

时间:2016-10-03 00:06:25

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

我想使用MVC的DisplayTemplates格式化作为JSON ajax响应的一部分包含的HTML。

HTML作为在控制器外部创建的bool checknxn(char grid[10][10]) { int columns = 0; for(int i=0;i<10;i++) { if(grid[0][i]!=NULL) columns++; else { break; } } for(int i=1;i<10;i++) { for(int j=columns;j<10;j++) { if(grid[i][j]!=NULL) return false; } } int rows = 0; for(int i=0;i<10;i++) { if(grid[i][0]!=NULL) rows++; else { break; } } if (!(rows == columns)) return false; for(int i=0;i<rows;i++) { for(int j=0;j<columns;j++) { if(grid[i][j]==NULL) { return false; } } } return true; } 类(我的)的一部分返回,因此我不想使用简单的,基于控制器的RenderViewToString()方法,我宁愿选择。

我找到了4种可能的方法来做到这一点,但没有一个让我高兴。我不知道哪个是最好用的,如果有的话。对我来说,他们看起来过于复杂(1,4),过于臭(2)或者头顶沉重(3)。

有人可以建议哪些可能是最有效/最好用的吗?我没有经验来衡量每个人的利弊。

1。 RazorEngine

我曾计划使用RazorEngine - 当我研究它时,it seemed simple enough

FILE *file1 = fopen(argv[1], "r"); // "r" for read char grid[10][10]; char c; for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ fscanf(file1,"%c", &c); if (c == '\n') { grid[i][j] = '\0'; break; } if (c == ' ') { grid[i][j] = '\0'; continue; } if (c == '\0') { grid[i][j] = '\0'; continue; } else { grid[i][j] = c; } } }

但这种方法已经过时了。当我看到the docs时,似乎有很多'突破性变化'。我正在努力解决我应该如何实现,如何缓存,何时从磁盘读取等等。

2。使用RenderViewToString() - 将控制器作为参数传递

我真的不想这样做,因为它看起来很麻烦,将链条进一步传递到其他代码中。

第3。创建一个假控制器

一个选项是创建一个FakeController(this question的接受答案),但这似乎有点矫枉过正。我不记得我在哪里看到它,但我在某处读到它对性能不是很好。

4。使用虚拟路径提供程序渲染类

BuildStarted上的

This is another approach I saw。同样,我在这里不够深入,所以不能说这种方法的优点和缺点是什么。

1 个答案:

答案 0 :(得分:0)

嗯,无论你做什么,一般原则都是尽量减少你的代码。剃刀做的确切。它的设计目的是与MVC一起使用,如果你强力键入它,它将为你提供更少量的代码,当然还有更少的渲染量。我建议使用剃刀方法。

第一个是我最好的选择。其余的看起来有点矫枉过正。这是个人意见,我认为这里没有绝对的最佳做法。