MVC验证在Knockoutjs帖子中丢失了

时间:2013-03-08 15:25:24

标签: asp.net-mvc-4 knockout.js validation asp.net-mvc-viewmodel

我正在使用MVC4和淘汰赛。我在页面上有一个表单,该表单是一个强类型的视图模型。在该视图模型中,我定义了一些验证,例如:

[Required(ErrorMessage = "Title is required")]
public string Title { get; set; }

如果我在没有填写必填字段的情况下对表单执行标准发布,我的操作会看到该模型无效并返回到视图,并显示主验证消息,因为我在@Html.ValidationSummary中有@Html.ValidationMessageFor形成。单个字段也标记为无效(带有消息),因为我有ko.utils.postJson($("form")[0], self);与字段

相关联

然后我添加了淘汰赛,而不只是发布我现在称之为var model = @Html.Raw(Json.Encode(Model)); 的表格。现在大多数一切正常,如果我发布的表单中没有填充必填字段,我的操作检测到模型无效并返回到视图,除非现在没有显示单个验证消息。

帖子前填写的字段也会丢失。我尝试通过读取mvc viewmodel并将变量设置为这样的值来解决这个问题。

self.Title = ko.observable(model.Title);

然后在我的淘汰视图模型中设置该值

{{1}}

但是当我输入'1'时,当失败的帖子返回时,它会用'“1”填充字段。

这不是一个表单太复杂,所以如果可以避免,我不想引入一些新的验证层。我不介意有一个验证的帖子。

谢谢,Dan

2 个答案:

答案 0 :(得分:5)

我有什么问题。过去两周我一直在探讨这个话题。 (如果你愿意,可以查看我最近几天的问题)。我得出结论,数据注释和流畅验证不适用于使用淘汰不幸的客户端。因此,您必须引入另一层验证。

好消息是它经过了良好的测试,并且像淘汰赛一样标准。

您主要有三种选择:

我期待社区倾向于建议使用jQuery,但显然主流验证是淘汰赛的首选。它的行为与数据注释非常相似,但显然是在挖空视图模型字段中完成的。

希望这有帮助(不要拍摄信使:))

答案 1 :(得分:0)

我正在研究类似的情况,做一个混合的web api / MVC项目。只有细节页面从控制器接收任何数据。休息由淘汰赛处理。 选项我可以看到sofar(一些测试,一些合格的猜测):

  1. 通过ViewModel和Knockout Clientside ViewModel复制您的validationlogic(如上所述,优先使用Knockout-Validation)。对我来说本能地感觉很时髦。
  2. 使用jquery unobtrusive验证将表单设置为常规mvc强类型表单。
  3. 1,2:使用knockout / jquery处理事件(当表单被认为有效时)。如果异步帖包含错误则返回并显示它们(某些css / less / sass框架,如bootstrap有准备好的alertbox类,例如将错误输入)。

    1. 查看MVC Control Toolkits clientblock。我打算自己测试这个选项,看起来很有希望。
    2. 尝试KnockoutMvc,这似乎也可以帮助解决这个问题。