在要在视图中读取的Partial中设置ViewData项

时间:2009-07-15 12:39:32

标签: asp.net-mvc

我有一个我称之为RenderPartial的视图。

在Partial usercontrol中,我设置了ViewData["IsTextAreaVisible"] = true;

在致电RenderPartial后的我的视图中,我检查了ViewData["IsTextAreaVisible"]的值。

即使usercontrol设置了它,View也认为它是null。

这是一个错误还是有更好的方法?

由于

4 个答案:

答案 0 :(得分:3)

这是按设计工作的。

每个局部视图都有自己的视图数据副本,因此它所做的任何更改都不会污染原始视图。你想做什么,我们明确禁止。

答案 1 :(得分:1)

我认为RenderPartial方法实际上是从您将其作为ViewData传递的对象中生成一个新字典。由于字典不同,原始字体不会包含您添加到其中的任何新值。

在我看来,如果你可以计算你在partial中设置的值,你也应该能够在父视图中计算它。您可能想要考虑反转计算并在父视图中执行它并在调用partial之前添加它。您可以随时检查部分是否可用,如果未设置,则根据需要重新计算。

答案 2 :(得分:0)

视图组件之间的数据交换看起来像是设计错误。视图(全部或部分)只是被动地和愚蠢地显示模型状态。所有检查,调用和设置值都应在模型/控制器中完成。我建议你重新考虑一下你的架构。即使你现在看起来很好也很合适,你很可能迟早要重新设计这段代码。

答案 3 :(得分:0)

扩展Brad的说法,用JavaScript做客户端。使用JQuery,您可以查看页面上是否有任何可见的文本框,并启动客户端。

$(document).ready(function() {
  if ($("input[@type=text]:visible").length > 0) {
    // inject JS file and init tinyMCE.
    $.getScript('<%= ResolveUrl("~/Scripts/tinymce/tiny_mce.js")' %>, function() {
      // TODO: call tinyMCE's init function here
    });
  }
});

只有在有可见的输入时才会初始化它。

有关getScript

的限制,请参阅http://docs.jquery.com/Ajax/jQuery.getScript

编辑:根据Jon的评论编辑扩展它。请注意,我没有在浏览器中运行此修订版编辑,因此可能会出现打嗝或两次打嗝。此外,如果你接受这个解决方案,这应该真的用jQuery重新标记。