ASP.NET MVC RemoteAttribute不会触发操作方法在控制器

问题描述:

1.项目规范ASP.NET MVC RemoteAttribute不会触发操作方法在控制器

任务:检查用户输入唯一的字典名称。

模型(在我的项目的所有实体都在单独的类):

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我” m包括到由ajax查询引导模式中,如下所示:

​​

2.问题

DictionaryNameExists方法没有触发。我在那里设置了断点,它不会'打'它。其次,即使当我输入现有名称时,ModelState.IsValid也是如此。 ModelState.IsValid适用于MaxLengthAttribute和RequiredAttribute。

3 Whathaveyoutried.com

  • 我已经启用了在web.config中(ClientValidationEnabled和UnobtrusiveJavaScriptEnabled)设置
  • 如下我添加的属性我控制器:

    [OutputCache(Location = OutputCacheLocation.None,NoStore = true)]

  • 我已经添加了HttpG et属性到方法和RemoteAttribute也是如此。

  • 我已经包含JavaScript库
  • 服务器正确生成我的标签:

...数据-VAL-远程= “!字典名称已经存在于数据库”数据-VAL-远程additionalfields = “*名” 数据-VAL-远程URL = “/管理/ DictionaryNameExists” ......

  • 作为Darin回答我加了他的代码,我的 “MakeGetRequestFunction”
  • 最后我清除了浏览器(Chrome)缓存。
  • 我的视图模型是包含我的实体类的类,所以我的想法是,以我的绑定属性,但它也没有为我工作

4.什么呢?

我可以自定义属性,但我在单独的库中有模型,所以我不能在那里注入我的存储库以检查唯一性。出于同样的原因,我不能使用如FluentValidation这样的库。我相信我的行动没有解雇的原因很简单。我在寻求你的帮助。

+0

您已经使用Authorize属性装饰了Controller并且DictionaryNameExists也位于此控制器中,所以这不应该成为问题吗? – Mairaj

+0

这是我第一次想到的,所以我在我的方法上使用了[AllowAnonymous]。它没有帮助。但是谢谢你的时间。 –

因为您的内容在验证呼叫后加载。您需要在加载部分视图后调用验证和解析。

$.get(url, function (data) { 
    $("#containerId").html(data); 
    $("#modalId").modal('show'); 
    var form = $('form'); 
    form.removeData('validator'); 
    form.removeData('unobtrusiveValidation'); 
    $.validator.unobtrusive.parse(form); 
}); 
+0

谢谢它解决了我的问题。 所以这是我的错误。我确实从验证程序中删除了数据,但是我在$ .get(url,function(data){})后执行了该操作。不在这个建筑里面。 –