Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ajax Asp Mvc3和kendo+;提交时不会触发服务器验证;击倒_Ajax_Asp.net Mvc 3_Knockout.js_Fluentvalidation - Fatal编程技术网

使用Ajax Asp Mvc3和kendo+;提交时不会触发服务器验证;击倒

使用Ajax Asp Mvc3和kendo+;提交时不会触发服务器验证;击倒,ajax,asp.net-mvc-3,knockout.js,fluentvalidation,Ajax,Asp.net Mvc 3,Knockout.js,Fluentvalidation,我有Asp Mvc3应用程序。在我看来,我使用的是kendoui+knockoutjs。我正在使用kendo validator处理客户端验证。我对asp mvc3非常陌生,无法进行服务器端验证 这是我的业务目标: [Validator(typeof(FranchiseInfoValidator))] public class FranchiseInfo { public string FullName { get; set; } public s

我有Asp Mvc3应用程序。在我看来,我使用的是kendoui+knockoutjs。我正在使用kendo validator处理客户端验证。我对asp mvc3非常陌生,无法进行服务器端验证

这是我的业务目标:

[Validator(typeof(FranchiseInfoValidator))]
    public class FranchiseInfo
    {
        public string FullName { get; set; }
        public string ShortName { get; set; }
    }
}
我正在使用FluentValidation。这是我的验证规则的实现:

public class FranchiseInfoValidator : AbstractValidator<FranchiseInfo>
    {
        public FranchiseInfoValidator()
        {
            RuleFor(franchiseInfo => franchiseInfo.FullName).NotEmpty();
            RuleFor(franchiseInfo => franchiseInfo.ShortName).NotEmpty();
        }
    }
这是我对InfoViewModel的强类型视图:

@model MvcApplication2.Models.FranchiseInfoViewModel

<script src="../../Scripts/Details.js" type="text/javascript"></script>

<form id="franchiseForm" action="" style="font-family: Trebuchet MS, Verdana, Helvetica, Sans-Serif;"> 
     <table>
            <tr>
                <td><label for="fullName">FullName:</label></td>
                <td><input id="fullName" data-bind= "value: FullName" /></td>
            </tr>
            <tr>
                <td><label for="shortName">ShortName:</label></td>
                <td><input id="shortName" data-bind= "value: shortName" /></td>
            </tr>
    </table>
    <button id="submit" class="k-button" data-bind="click: save" form="franchiseForm">Save Franchise</button>
</form>
保存时,我将以json格式提交数据,并将数据发送到saveFrancision控制器:

public ActionResult SaveFranchise(string franchiseInfoViewModel)
        {
            var franchiseInfoVM = JsonConvert.DeserializeObject<FranchiseInfoViewModel>(franchiseInfoViewModel);

            if (!ModelState.IsValid)
            { 
                // do some action
            }

            return View();
        }
public ActionResult保存特许经营权(字符串特许经营权信息视图模型)
{
var franceinfovm=JsonConvert.DeserializeObject(franceinfoviewmodel);
如果(!ModelState.IsValid)
{ 
//采取行动
}
返回视图();
}
我要完成的是在
(!ModelState.IsValid)
上返回视图并显示验证错误消息。出于某种原因,在我的例子中,ModelState.IsValid始终为true

如前所述,我对Asp Mvc 3非常陌生。从我读过的文章中,示例是将表单提交到服务器(不带javascript),在服务器上有绑定,服务器验证消息返回到视图。但是在那里,视图是用Razor实现的,客户端验证是通过jquery完成的

在我看来,我使用带有数据绑定的javascript视图模型(kendoui+knockout)。在我的案例中,我应该如何进行服务器端验证。请帮帮我。谢谢你的时间和努力

简短回答:

您应该在控制器操作中使用模型绑定-这样做可以使用
ModelState.IsValid

因此,您的控制器操作:

public ActionResult SaveFranchise(string franchiseInfoViewModel)
。。应更改为以下内容:

public ActionResult Create(FranchiseInfo franchiseInfo)
public ActionResult Create(FranchiseInfo franchiseInfo)
请确保以允许模型绑定器实例化
特许经营信息
模型实例的格式发布表单。您可以使用JSON来实现这一点,但我认为,如果您只使用表单上的标准
action
属性发布表单会更好(更简单)

详细答复:

我首先建议您使用ASP.NET MVC框架提供的模型验证,包括用于服务器端验证的模型绑定、模型状态和数据注释,以及用于客户端验证的不引人注目的javascript。这样做将为您提供一种更清晰的实现方式

为了达到这一目的,我建议您首先看看ASP.NETMVC中的模型绑定

如下列文件所述:

通过模型绑定,控制器操作可以专注于提供业务价值,避免浪费时间进行普通的请求映射和解析

要了解这一点,这对模型绑定器有一个很好的定义:

MVC中的模型绑定器提供了一种简单的方法,可以将发布的表单值映射到.NET Framework类型,并将该类型作为参数传递给操作方法。(…)模型绑定器类似于类型转换器,因为它们可以将HTTP请求转换为传递给操作方法的对象

有了这个抽象概念,您很快就会看到:

public ActionResult SaveFranchise(string franchiseInfoViewModel)
。。可以更改为以下内容:

public ActionResult Create(FranchiseInfo franchiseInfo)
public ActionResult Create(FranchiseInfo franchiseInfo)
。。。在这一点上,事情已经开始变得更加清晰,因为像自定义数据映射这样的代码:

var franchiseInfoVM = JsonConvert.DeserializeObject<FranchiseInfoViewModel>(franchiseInfoViewModel);
(该示例借用自:)

在模型中填充数据注释可以让您很容易地在提交给定表单时检查模型是否有效,并且您正在检查给定操作中提供的模型的有效性-在这里
ModelState。IsValid
被证明是有用的

如上所述:

(…)第二个Create方法调用
ModelState.IsValid
来检查电影是否有任何验证错误。调用此方法将评估已应用于对象的所有验证属性

因此,在这一点上,您应该能够看到,使用数据注释来声明模型上的约束/必需行为将允许您有一个简单的实现,其中逻辑在模型中定义,并且可以使用
ModelState.IsValid
轻松检查

为了进一步说明这一点,我可以告诉您我在ASP.NET MVC3中在服务器端和客户端进行模型验证的一些经验

正如您可能已经猜到的,当涉及到模型验证时,我对ASP.NET MVC3的最佳体验是使用数据注释和通过
ModelState.IsValid进行服务器端验证的内置支持,以及通过不引人注目的JavaScript进行客户端验证

对于数据注释,我使用内置注释和项目提供的扩展的组合

使用ASP.NET MVC3支持不引人注目的客户端验证有两个好处

  • 首先,这很容易实现,因为模型验证逻辑只定义了一个地方,即它所属的模型中
  • 其次,您可以在视图中获得更多的实现(避免重复的逻辑,获得更易于维护的代码),并让框架替您完成繁重的工作
可以找到如何在ASP.NET MVC3中使用不引人注目的客户端验证的示例

然而,有时使用注释可能看起来并不像straigt所说的那样,例如,当您想要验证诸如信用卡和文件扩展名之类的属性时。在这些情况下,逻辑需要基本注释以外的替代方法,我倾向于使用(除非我可以针对.NET 4.5的应用程序,例如,
FileExtensionAttribute
),因为它们提供了一系列出色的注释扩展,可以立即使用(这是真的
public class Movie
{
    public int ID { get; set; }

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

    [Required(ErrorMessage = "Date is required")]
    public DateTime ReleaseDate { get; set; }

    [Required(ErrorMessage = "Genre must be specified")]
    public string Genre { get; set; }

    [Required(ErrorMessage = "Price Required")]
    [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}