使用AngularJS的ASP.NET MVC验证表单

and*_*lzo 36 validation asp.net-mvc data-annotations razor angularjs

我正在使用MVC 4和AngularJS(+ twitter bootstrap)中的项目.我通常在我的MVC项目中使用"jQuery.Validate","DataAnnotations"和"Razor".然后我在web.config中启用这些键以验证客户端上模型的属性:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
Run Code Online (Sandbox Code Playgroud)

例如,如果我在我的模型中有这个:

[Required]
[Display(Name = "Your name")]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

有了这个Cshtml:

@Html.LabelFor(model => model.Name)
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
Run Code Online (Sandbox Code Playgroud)

html结果将:

<label for="Name">Your name</label>
<input data-val="true" data-val-required="The field Your name is required." id="Name" name="Name" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span>
Run Code Online (Sandbox Code Playgroud)

但是现在当我使用AngularJS时,我想渲染可能是这样的:

<label for="Name">Your name</label>
<input type="text" ng-model="Name" id="Name" name="Name" required />
<div ng-show="form.Name.$invalid">
   <span ng-show="form.Name.$error.required">The field Your name is required</span>
</div>
Run Code Online (Sandbox Code Playgroud)

我不知道是否有任何助手或"数据注释"来解决这个问题.我知道AngularJS还有很多其他功能:

<div ng-show="form.uEmail.$dirty && form.uEmail.$invalid">Invalid:
    <span ng-show="form.uEmail.$error.required">Tell us your email.</span>
    <span ng-show="form.uEmail.$error.email">This is not a valid email.</span>
</div>
Run Code Online (Sandbox Code Playgroud)

好吧,具体来说.我需要一些帮助器或"数据注释"来解析使用AngularJS在客户端上显示的属性(数据注释).

如果它仍然不存在,也许是时候做了,比如RazorForAngularJS

编辑

我想也许使用ASP.NET MVC和AngularJS的最佳方法是front-end手工完成()(手工编写所有HTML)

Ben*_*esh 29

作为一个撰写ASP.Net/Angular网站的人,我可以告诉你,如果你不想使用Razor来渲染你的HTML,你会更好.

在我的项目中,我设置了一个剃刀视图来渲染我的主页面(我使用的是一个用Angular编写的单页面应用程序),然后我有一个直接.html文件的文件夹,我用它作为我的Angular模板.

其余部分在我的情况下在ASP.Net Web API调用中完成,但您也可以使用带有JSON结果的MVC操作.

一旦我切换到这个架构,对我来说事情变得更顺利,发展明智.

  • 就个人而言,我发现在客户端上使用Angular的内置验证非常简单,然后在服务器上使用.NET的DataAnnotations验证.我认为尝试将.NET内容推送到客户端可能最终会让人头疼,而不是真正值得. (9认同)
  • 任何东西都可以发布到API,这是通过网络进行交互的另一种方式.提供服务并以任何您想要的方式编写客户.所以无论如何你都会有这种可能性.无论如何,从服务器生成客户端验证是粗略的业务. (6认同)
  • 我正在考虑沿着这条路走一个项目,但你将如何处理验证?我想重新使用我在C#视图模型上设置的验证,并将它们传递给客户端javascript验证(例如jquery.validate或类似的东西).另一种方法是在向WebApi控制器发送请求并捕获它们以显示给用户之后从服务器返回错误.顺便说一下,我对AngularJs很新,但很想开始. (5认同)
  • @blesh,虽然我同意它可能是给定约束的最佳方法,但是你有重复的验证,因此面临如何验证字段不一致的可能性. (3认同)
  • +1我同意Blesh 100%同意.如果您认为AngularJS和MVC的生活很艰难,请尝试与Web Forms集成.绝对的噩梦.试图在`RadioButtonList`中将`n​​g-model`添加到`ListItem`?...为你随机包装span标签!我决定使用膨胀的.NET控件完全废弃,只使用标准的HTML元素.然后我将表单值绑定到回发上的POCO模型,让DataAnnotations负责服务器端验证FTW. (2认同)

ali*_*ari 9

我同意关于离开剃刀的肉体想法,但你可以创建一些工具来更快地创建页面.恕我直言,最好在他们需要的地方使用剃刀功能,而不是从工具箱中删除它.

BTW看看ngval.它将数据注释作为angularjs验证器提供给客户端.它有一个html帮助器和一个角度模块.我必须提到该项目处于早期开发阶段.