Gen*_*ari 43 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4
我继承了用ASP.Net MVC 4编写的代码库FormCollection
.每个post方法都需要一个.除了必须通过带引号的字符串访问值的烦恼之外,它还会导致诸如无法在我的ViewModel属性上使用类似东西ModelState.IsValid
或[AllowHtml]
属性之类的缺点.他们实际上并创建视图模型类为每个自己的看法,(尽管他们是非常实际的实体框架模型类只左右直接包装),但它们仅用于GET方法.
有没有什么我错过的FormCollection给出了为什么这可能实际上是一个好主意的原因?它似乎只有缺点.我想通过使用ViewModels来"修复"它.这需要花费很多工作,因为ViewModel具有接口而不是具体类的属性,这意味着要么编写自定义绑定器,要么更改ViewModel.
但也许在我使用FormCollection有意义的地方缺少一些东西?
Ima*_*ani 44
是否有充分的理由使用FormCollection而不是ViewModel?
不,我有以下问题.
问题 - 1
如果FormCollection
正在使用......这将是强制性Type Cast
的Primitive Type
价值观未不一定是因为当得到的特定指数的进入System.Collections.Specialized.NameValueCollection
,返回值的类型的String
.在强类型的情况下不会出现这种情况View-Models
.
问题 - 2
当您提交表单并转到Post
Action Method,并且Action方法中View-Model
存在Parameter时,您可以将发布的值发回给您View
.否则,再次编写代码以通过发送回来TempData/ViewData/ViewBag
View-Models是普通类,用于将数据绑定到View
问题 - 3
我们有可以在View Model
或中实现的数据注释Custom Validations
.
ASP.Net MVC使用Data Annotation简化了模型验证.数据注释是在属性上应用thyat的属性.我们可以通过继承内置的Validation Attribute类来创建自定义验证属性.
问题 - 4
示例您有以下HTML
<input type="text" name="textBox1" value="harsha" customAttr1 = "MyValue" />
Run Code Online (Sandbox Code Playgroud)
问题:我们如何从上面例如从控制器内部访问customAttr1的值
答案:当表单发布时,只将元素的名称和值发回服务器.
替代方法:使用一些jQuery来获取自定义属性值,并将其与表单值一起发布到操作方法
另一个选择是将您在自定义属性中获得的内容放入隐藏控件中
这就是原因,我总是喜欢使用 View-Models
我能想到的唯一优势是,如果您想要使用自动生成的控制器,而不指定要强类型化的EF模型.在这种情况下,您的创建和编辑操作将使用FormCollection对象,因为它是一个可靠的,预先存在的框架工件,可用于此目的.也许之前的开发人员在创建控制器时选择了这个选项,并坚持使用它,因为Visual Studio必须知道它在做什么:)
但是,实际上,我绝不会推荐几秒钟的这个开端.构建视图模型总是更好,我建议看看为了维护目的而朝这个方向移动的努力.使用模型绑定和强类型视图以及html帮助程序,您更有可能减少因更改某些魔术字符串而在页面爆炸之前无法实现的运行时错误数.
好的,我看到这里的普遍共识是不喜欢它.为了提供另一个视角,我总是喜欢在POST操作中使用传递给控制器的formcollection.它提供了控制器中TryUpdateModel方法的使用,该方法将集合映射到强类型类.TryUpdateModel还具有重载,允许您白名单列出要允许更新的模型的属性.
if (TryUpdateModel(viewModel, new string[] { "Name" }))
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
它仍然允许您想要的所有模型绑定,但有助于保持我的viewmodel上的"Name"属性以外的任何内容不被更新.
您可以在此处查看有关TryUpdateModel方法的更多信息:
http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryupdatemodel(v=vs.108).aspx
归档时间: |
|
查看次数: |
15640 次 |
最近记录: |