繁体   English   中英

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

[英]ASP.NET MVC RemoteAttribute does not trigger action method in controller

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>}

在View上方是PartialView,我通过ajax查询将其包含到引导模式中,如下所示:

function MakeGetRequest() {
    var url = "/Administrator/AddDictionary/";

    $.get(url, function (data) {
        $("#containerId").html(data);
        $("#modalId").modal('show');
    });
}

2.问题

DictionaryNameExists方法未触发。 我在此处设置了断点,而不是“命中”它。 其次,即使我输入现有名称,ModelState.IsValid始终为true。 ModelState.IsValid对于MaxLengthAttribute和RequiredAttribute正常工作。

3. Whathaveyoutried.com

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

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

  • 我已经将HttpGet属性添加到方法和RemoteAttribute中。

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

... data-val-remote =“词典名称已存在于数据库中!” data-val-remote-additionalfields =“ *。Name” data-val-remote-url =“ / Administrator / DictionaryNameExists” ...

  • 正如Darin回答的那样,我已将他的代码添加到“ MakeGetRequestFunction”中
  • 最后,我清除了浏览器(Chrome)缓存。
  • 我的ViewModel是一个包含Entity类的类,所以我想绑定我的属性,但是它对我也不起作用

4.现在呢?

我可以创建自定义属性,但是我在单独的库中有模型,因此无法在此处注入我的存储库来检查唯一性。 出于同样的原因,我不能使用FluentValidation这样的库。 我相信,有一个简单的原因导致我的“动作”未触发。 我正在寻求您的帮助。

因为您的内容是在验证调用之后加载的。 加载部分视图后,需要调用验证并从中进行解析。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM