我如何做客户验证与ASP形成.asp.net MVC 5
本文关键字:asp 形成 net MVC ASP 何做 客户 验证 | 更新日期: 2023-09-27 18:07:12
我是ASP新手。asp.net MVC 5。我喜欢学习在视图和视图模型之间构建双向绑定的正确方法。并充分利用客户端验证脚本。
这是我所做的。
- 正在加载jQuery库v 1.10.1
- 正在加载jquery验证
- 我加载了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>
你的实现有一些问题。
生成表单控件的所有HtmlHelper
方法都生成正确的name
和value
属性,这是双向模型绑定所必需的。您正在重写这些值,以便控件现在与您的模型没有关系。
在文本框之前还有一个Request.LocalFrom
属性的隐藏输入,这样当您提交时,只有隐藏输入的值(属性的原始值)将被绑定,而文本框中的编辑值将被忽略。此外,由于隐藏输入,为客户端验证生成的data-val-*
属性已应用于隐藏输入,而不是文本框。
不清楚为什么你需要2个视图模型,理想情况下,你的DefaultViewPresenter
视图模型应该包含LocalFrom
和From
的属性,但是与你目前的模型,你的视图需要
@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: [] });
});
希望这对你有帮助!