我如何做客户验证与ASP形成.asp.net MVC 5

本文关键字:asp 形成 net MVC ASP 何做 客户 验证 | 更新日期: 2023-09-27 18:07:12

我是ASP新手。asp.net MVC 5。我喜欢学习在视图和视图模型之间构建双向绑定的正确方法。并充分利用客户端验证脚本。

这是我所做的。

  1. 正在加载jQuery库v 1.10.1
  2. 正在加载jquery验证
  3. 我加载了jquery . unobtrusiious . validation

我创建了一个像这样的ViewModel

public class RequestFormViewModel
{
    [Required]
    [Display(Name = "Day Of")]
    public DateTime LocalFrom { get; set; }
    [Required]
    [Display(Name = "Does not matter since this will be hidden and I use javascript to populate the value here when before the for is submitted")]
    public DateTime From { get; set; }
    public RequestFormViewModel()
    {
    }
    public RequestFormViewModel(DateTime localFrom, DateTime from)
    {
        this.LocalFrom = localFrom;
        this.From = from;
    }
}

这就是我创建视图的方法。请注意,我将演示器或业务层(即DefaultViewPresenter)传递给我的视图,而不是ViewModel。类DefaultViewPresenter有一个命名为Request的属性。(下面我将展示演示器的样子)

@model Proj.Presenters.DefaultViewPresenter
@using (Html.BeginForm("Index", "Track", FormMethod.Post, new { @class="form-inline", Id = "TrackActionForm" }))
{ 
    @Html.AntiForgeryToken()
    @Html.HiddenFor(m => m.Request.LocalFrom, new { Id = "TrackFrom", Name = "From" })                   
    <div class="input-group">
        @Html.TextBoxFor(m => m.Request.LocalFrom, new { Value = Model.Request.LocalFrom.ToString("MM/dd/yyyy"), @class = "form-control small", Id = "TrackLocalFrom", Name = "LocalFrom" })
        @Html.ValidationMessage("LocalFrom")
        <span class="input-group-btn">
            <button class="btn btn-info" type="button" id="TrackSubmit">View</button>
        </span>
    </div>
}

这是我的演示器的样子

public class DefaultViewPresenter
{
    public RequestFormViewModel Request { get; set; }
    .... // some other propertied that I need for the view that are not related to my form
    ....
    ....
}

当我提交表单时,表单没有被提交!我没有得到任何错误。它就像提交按钮在点击事件上具有return;功能。

我如何让脚本验证正确,当表单是有效的处理post请求?

我在这里错过了什么?我怎样才能纠正这个问题?

运行我的应用程序后这是razor生成的HTML标记

<form novalidate="novalidate" id="TrackActionForm" action="/Track" class="form-inline" method="post">
    <input name="__RequestVerificationToken" value="thmJX-Mlj5WjM3e7WMbgtb8KiEf4vuUKGzon4zO18fHDDY3cWpm2M1Lks8HbZDxX2qz7UxpRsoYvz2njNwYS_D8zclTvu9pdsJlSO0ckNLQ1" type="hidden">
    <input id="TrackFrom" name="From" data-val="true" data-val-date="The field Day Of must be a date." data-val-required="The Day Of field is required." value="9/14/2016 12:00:00 AM" type="hidden">                    
    <div class="input-group">
        <input id="TrackLocalFrom" name="LocalFrom" value="09/14/2016" class="form-control small" type="text">
        <span class="field-validation-valid" data-valmsg-for="LocalFrom" data-valmsg-replace="true"></span>
        <span class="input-group-btn">
            <button class="btn btn-info" type="button" id="TrackSubmit">View</button>
        </span>
    </div>
</form>

我如何做客户验证与ASP形成.asp.net MVC 5

你的实现有一些问题。

生成表单控件的所有HtmlHelper方法都生成正确的namevalue属性,这是双向模型绑定所必需的。您正在重写这些值,以便控件现在与您的模型没有关系。

在文本框之前还有一个Request.LocalFrom属性的隐藏输入,这样当您提交时,只有隐藏输入的值(属性的原始值)将被绑定,而文本框中的编辑值将被忽略。此外,由于隐藏输入,为客户端验证生成的data-val-*属性已应用于隐藏输入,而不是文本框。

不清楚为什么你需要2个视图模型,理想情况下,你的DefaultViewPresenter视图模型应该包含LocalFromFrom的属性,但是与你目前的模型,你的视图需要

@model Proj.Presenters.DefaultViewPresenter
@using (Html.BeginForm("Index", "Track", FormMethod.Post, new { @class="form-inline", Id = "TrackActionForm" }))
{ 
    @Html.AntiForgeryToken() 
    <div class="input-group">          
        @Html.TextBoxFor(m => m.Request.LocalFrom, "{0:MM/dd/yyyy}", new { @class = "form-control small" })
        @Html.ValidationMessageFor(m => m.Request.LocalFrom)
        <span class="input-group-btn">
            <button class="btn btn-info" type="submit" id="TrackSubmit">View</button> // change to a submit button
        </span>
    </div>
}

注意TextBoxFor()中的第二个参数是格式字符串,但如果您使用[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]应用于该属性,则可以省略该参数。还请注意,HtmlHelper方法根据属性名生成id属性,通常没有理由覆盖它。

作为旁注,建议在您的视图模型中,使用[Required]属性创建值类型属性nullable,以防止下发布攻击(恶意用户返回并省略属性的名称/值对,在这种情况下,它将初始化为默认值(DateTime.MinValue))。

[Required(ErrorMessage = "Please enter ...")]
[Display(Name = "Day Of")]
public DateTime? LocalFrom { get; set; }

默认情况下,JQuery验证忽略客户端验证的隐藏字段。在视图或_layout.cshtml的脚本块中尝试以下操作:

$(document).ready(function(){ 
 $.validator.setDefaults({ ignore: [] });
});

希望这对你有帮助!