2012-07-08 41 views
2

我现在有:如何更好地利用实体模型验证?

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

我想此(显然为价格输入)分割成由十进制分离2个独立的字段。但是如果我使用基本的文本框来做这件事,我将失去利用ASP.NET验证的能力。

有没有办法做到这一点,在剃刀或使用属性,以便我能够保持JS和服务器端验证对我的实体模型?

我可以通过在viewmodel中创建自己的函数轻松地在别的地方做到这一点,但我是MVC3的新手,并不完全确定这是否是最好的路线或者有更简单的方法。

编辑:

这是一种我在想,我不完全了解这是如何工作的方向。

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

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

但是,我可以看看那个,并告诉这是行不通的。所以,我想这个问题真的是用户输入如何针对实体模型进行验证,以及如何更好地利用内置功能?

+1

所以你想要两个文本bosex一个数字和另一个小数,但你的模型是作为一个数字,如果这种情况下,我会建议使用它可能jquey在客户端,你可能会失去简单的能力在模型中验证,但你不必通过编写一个单独的模型或HTML助手的麻烦,只是为了这一点,你仍然可以验证与jQuery – 2012-07-08 22:46:04

回答

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文件夹移动到相应的视图子文件夹而不是共享的文件夹来将其范围扩大到特定的控制器。