Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 什么时候使用ViewData而不是ViewModels是正确的?_Asp.net Mvc_Viewmodel_Viewdata - Fatal编程技术网

Asp.net mvc 什么时候使用ViewData而不是ViewModels是正确的?

Asp.net mvc 什么时候使用ViewData而不是ViewModels是正确的?,asp.net-mvc,viewmodel,viewdata,Asp.net Mvc,Viewmodel,Viewdata,假设您希望开发控制器,以便使用ViewModel包含渲染视图的数据,那么所有数据是否都应包含在ViewModel中?在什么条件下可以绕过ViewModel 我问这个问题的原因是我所处的位置,其中一些代码正在使用ViewData,一些代码正在使用ViewModel。我想在团队中发布一组关于何时正确使用ViewData以及何时只是使用快捷方式的指导原则。我想听听其他处理过这个问题的开发人员的意见,这样我就知道我的指导方针不仅仅是我有偏见。我个人从不使用ViewData,所有的东西都会通过模型,除了我

假设您希望开发控制器,以便使用ViewModel包含渲染视图的数据,那么所有数据是否都应包含在ViewModel中?在什么条件下可以绕过ViewModel


我问这个问题的原因是我所处的位置,其中一些代码正在使用ViewData,一些代码正在使用ViewModel。我想在团队中发布一组关于何时正确使用ViewData以及何时只是使用快捷方式的指导原则。我想听听其他处理过这个问题的开发人员的意见,这样我就知道我的指导方针不仅仅是我有偏见。

我个人从不使用ViewData,所有的东西都会通过模型,除了我测试一些东西时,我很快就需要能够看到视图上的值。strong打字

仅进一步说明费边的评论;通过执行中概述的步骤,可以明确确保从不使用viewdata。真的没有理由什么都不使用模型


如果您别无选择,只能使用ViewData(例如在现有项目上);至少要使用字符串常量来解析名称,以避免使用“魔术字符串”。大致如下:
ViewData[ViewDataKeys.MyKey]=myvalue事实上,我使用它来处理任何需要“基于字符串”的内容(会话键、缓存键、VaryByCustom输出缓存键等)。

对于ASP.NET MVC 2,ViewModel模式是首选方法。该方法充分利用了编译时静态类型检查。这与将使您的开发工作流程更快、更高效,因为错误是在构建/编译时而不是运行时检测到的

< P>一种方法,你可能会考虑到你的观点变得更复杂,就是保留对输入字段的模型的使用,并使用VIEW数据支持视图所需的任何其他内容。p> 至少有几个论据支持这一点:

  • 您有一个母版页,需要显示一些数据(例如,标题中的StackOverflow用户信息)。应用站点范围的ActionFilter可以轻松地在每次操作后在ViewData中填充此信息。要将其放入模型中,需要站点中的每个其他模型都继承自一个基础模型(这一点最初看起来可能并不糟糕,但很快就会变得复杂)

  • 验证已发布表单时,如果存在验证错误,则可能需要将模型(包含无效字段)重新绑定到视图并显示验证消息。这很好,因为输入字段中的数据会被发回并绑定到模型,但是视图需要重新填充的任何其他数据呢?(例如,下拉列表值、信息消息等)这些将不会被发回,重新将这些值“围绕”发回的输入值填充到模型中可能会变得混乱。使用..视图数据填充ViewData的方法通常更简单

  • 根据我的经验,我发现这种方法很有效


    而且,在MVC3中,这意味着没有更多的字符串索引

    我完全同意。魔弦充其量是丑陋的,最糟糕的是麻烦。也就是说,我也使用ViewData来快速测试东西,但问题是当它最终成为永久解决方案时!是的,100%同意。我更希望这种方法甚至可以被弃用。@Pure.Krome:您当然可以使用我的帖子中描述的方法模拟折旧。重写基本控制器中的viewdata属性并添加[Observe()]属性将得到相同的结果(本质上)。+1-我们在这里始终使用stongly类型的viewmodels,但确实使用viewdata进行少量附加的“修剪”。这通常只发生在局部视图中,这些视图在许多地方重复使用。@jim:同意,在某些情况下(如共享局部视图),这是不可避免的;因此,当您需要回退使用ViewData时,最好采取措施防止自食其果:)字符串常量与魔法字符串的区别是什么?为什么在共享部分视图中使用ViewData不可避免?@Howiecamp:string常量至少是强类型的;所以,它们应该总是比使用字符串文本来访问字典数据更受欢迎(这也为您提供了一个固定位置中的键的良好“注册表”)。关于ViewData的使用是“不可避免的”,这并不是完全准确的,但它有时是尝试创建某种基本“上帝”模型来处理所有情况的最佳选择。希望这有助于澄清我的一些评论:)