1。项目规范
任务:检查用户是否输入了唯一的字典名称。
模型(我项目中的所有实体都在单独的类中):
public class Dictionary
{
[Required]
[Index("IX_Dictionary_Name_UK", IsUnique = true)]
[MaxLength(100)]
[Display(Name="Name")]
[Remote("DictionaryNameExists", "Administrator", ErrorMessage = "Dictionary name already exists in the database!")]
public string Name { get; set; }
}
控制器:
[Authorize(Roles="Administrator")]
public class AdministratorController : BaseController
{
public AdministratorController(IDictionaryRepository dictionaryRepository)
{
this.dictionaryRepository = dictionaryRepository;
this.dictionaryModel = new DictionaryModel();
}
[AllowAnonymous]
public JsonResult DictionaryNameExists(string Name)
{
return Json(dictionaryRepository.DictionaryNameExists(Name), JsonRequestBehavior.AllowGet);
}
}
查看:
@using (Html.BeginForm("AddEditDictionary", "Administrator")){
<div id="dictionaryContainer" class="modal-body">
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.Dictionary.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Dictionary.Name)
@Html.ValidationMessageFor(model => model.Dictionary.Name)
</div>
</fieldset>
</div>
<div class="modal-footer">
<button id="btnSaveChanges" type="submit" name="command" value="Save" class="btn btn-primary">Save dictionary</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>}
上面的视图是一个PartialView,我通过ajax查询包含在bootstrap模式中,如下所示:
function MakeGetRequest() {
var url = "/Administrator/AddDictionary/";
$.get(url, function (data) {
$("#containerId").html(data);
$("#modalId").modal('show');
});
}
2。问题
DictionaryNameExists方法未触发。我在那里设置了断点并且它没有“击中&#39;它。其次,即使我输入现有名称,ModelState.IsValid也始终为true。 ModelState.IsValid适用于MaxLengthAttribute和RequiredAttribute。
第3。 Whathaveyoutried.com
我已按如下方式向控制器添加了一个属性:
[OutputCache(Location = OutputCacheLocation.None,NoStore = true)]
我已将HttpGet属性添加到方法和RemoteAttribute中。
... data-val-remote =&#34;数据库中已存在字典名称!&#34;数据-VAL-远程additionalfields =&#34; *名称&#34;数据-VAL-远程URL =&#34; /管理员/ DictionaryNameExists&#34; ...
4。现在怎么办?
我可以创建自定义属性,但我在单独的库中有模型,所以我不能在那里注入我的存储库来检查唯一性。出于同样的原因,我无法使用FluentValidation这样的库。我相信我的行动没有解雇的原因很简单。我在寻求你的帮助。
答案 0 :(得分:0)
因为您的内容是在验证调用后加载的。您需要在加载局部视图后调用验证并解析。
$.get(url, function (data) {
$("#containerId").html(data);
$("#modalId").modal('show');
var form = $('form');
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);
});