Asp.net mvc 4 MVC验证在Knockoutjs post中丢失

Asp.net mvc 4 MVC验证在Knockoutjs post中丢失,asp.net-mvc-4,knockout.js,validation,asp.net-mvc-viewmodel,Asp.net Mvc 4,Knockout.js,Validation,Asp.net Mvc Viewmodel,我用的是MVC4和击倒。我在页面上有一个表单,它是强类型的viewmodel。在该viewmodel中,我定义了一些验证,例如: [Required(ErrorMessage = "Title is required")] public string Title { get; set; } 如果我对表单执行标准post,但没有填写必填字段,则我的操作会发现模型无效并返回到视图,并且会显示一条主验证消息,因为我的表单中有@Html.ValidationSummary。单个字段也被标记为无效(带有

我用的是MVC4和击倒。我在页面上有一个表单,它是强类型的viewmodel。在该viewmodel中,我定义了一些验证,例如:

[Required(ErrorMessage = "Title is required")]
public string Title { get; set; }
如果我对表单执行标准post,但没有填写必填字段,则我的操作会发现模型无效并返回到视图,并且会显示一条主验证消息,因为我的表单中有
@Html.ValidationSummary
。单个字段也被标记为无效(带有消息),因为我有与该字段关联的
@Html.ValidationMessageFor

因此,我添加了knockout,而不是仅仅发布我现在调用的
ko.utils.postJson($(“form”)[0],self)。现在大部分工作正常,如果我发布表单时未填充必填字段,我的操作会检测到模型无效并返回到视图,除非现在没有显示单独的验证消息

帖子前填写的字段也将丢失。我试图通过读取mvc视图模型并将变量设置为类似的值来解决这个问题

var model = @Html.Raw(Json.Encode(Model));
然后在我的knockout viewmodel中设置该值

self.Title = ko.observable(model.Title);
但当我输入“1”时,当失败的帖子返回时,它会在字段中填入“1”

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


谢谢你,丹,我想问你的问题。在过去的两周里,我一直在探索这个话题。(如果你想的话,可以查阅我最近几天的问题)。我得出的结论是,数据注释和流畅的验证在使用knockout的客户端不起作用。因此,您必须引入另一层验证

好消息是它经过了很好的测试,和淘汰赛一样标准

您主要有三种选择:

我希望社区倾向于建议使用jQueryOne,但显然主流的淘汰验证是首选。它的行为与数据注释非常相似,但显然是在剔除视图模型字段上完成的


希望这能有所帮助(不要射击messenger:)

我正在考虑类似的情况,正在进行一个混合web api/MVC项目。其中,只有详细信息页面接收来自控制器的任何数据。其余部分由击倒球处理。 目前我能看到的选项(一些经过测试,一些经过验证的猜测):

  • 通过ViewModel和Knockout客户端ViewModel复制您的validationlogic(如上文所建议的,使用首选Knockout验证)。我本能地觉得很不舒服
  • 使用jquery无干扰验证将表单设置为常规mvc强类型表单 1,2:使用knockout/jquery处理事件(当表单被认为有效时)。如果async post包含错误,则返回并显示错误(例如,某些css/less/sass框架(如bootstrap)具有就绪的alertbox类,可将错误放入其中)

  • 退房。我计划亲自测试这个选项,看起来很有希望
  • 试试看,这似乎也能帮上忙
    @DanDotNet说它有帮助。谢天谢地,关于什么样的回答是正确的和有用的还没有决定。请相应地标记一个。完全错过了原始帖子的年龄;)但是,如果这对某人有帮助的话,还是让它来吧。请在下面标出正确的回答。非常感谢。