如何更好地利用实体模型验证?

时间:2012-07-08 22:37:22

标签: asp.net-mvc-3 entity-framework

我目前有:

@Html.EditorFor(model => model.PurchasePrice)

我想把它分成两个用小数分隔的单独字段(显然是价格输入)。但是,如果我使用基本文本框这样做,我将失去利用ASP.NET验证的能力。

有没有办法在Razor中或通过使用属性来执行此操作,以便我能够针对我的实体模型保留JS和服务器端验证?

我可以通过在viewmodel中创建自己的函数轻松地在其他地方执行此操作,但我是MVC3的新手,并不完全确定这是否是最佳路径或者有更简单的方法。

编辑:

这是我正在思考的方向,我不完全理解这是如何工作的。

我设置了2个字段,1个为ppDollar,1个为ppCents。在控制器中我有:

modelname.PurchasePrice = Request["ppDollar"] + Request["ppCent"];

但是,我可以看一下,并告诉它不会起作用。所以,我想问的问题是如何根据实体模型验证用户输入,以及如何更好地利用内置功能?

1 个答案:

答案 0 :(得分:1)

您可以为EditorFor呈现的特定类型创建自定义编辑器。您可以在线找到很多关于如何进行此操作的示例,其中大多数都专注于自定义DateTime编辑器,但同样的想法适用于任何类型。只是快速搜索的一个例子:

http://buildstarted.com/2010/09/10/overriding-displayfor-and-editorfor-to-create-custom-outputs-for-mvc/

简而言之,过程是:

  • 创建一个放置在Views\Shared\EditorTemplates文件夹中的部分视图模板,其名称与类型相同(例如Decimal.cshtml)。
  • 视图应使用您要显示的类型作为其模型:@inherits System.Web.Mvc.WebViewPage<System.Decimal>
  • 使用某些字段命名约定或其他任何内容,使视图显示您想要的任何内容。
  • 您还可以通过适当的EditorFor重载传递HTML属性,该重载在模板中通过ViewData.ModelMetadata.AdditionalValues属性引用。

有一点需要注意:一旦定义了编辑器模板,它将用于EditorFor的每次调用。您可以将EditorTemplates文件夹移动到相应的视图子文件夹而不是共享文件夹中,从而将它们扩展到特定控制器。