2014-12-30 4 views
1

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, включенных в bootstrap modal с помощью ajax-запроса, следующим образом:

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

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

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 библиотеки
  • сервера должным образом сгенерированные мои теги:

... Данные-валин-пульт = "! Словарь имя уже существует в базе данных" Данные-валин-remote-additionalfields = "*. Имя" данные-валин-удаленный URL = "/ Администратор/DictionaryNameExists" ...

  • Как Darin ответил я добавил свой код на "MakeGetRequestFunction"
  • Наконец, я очистил кеш браузера (Chrome).
  • Мой ViewModel класс, который содержит мой класс сущностей, так что моя мысль была связав свою собственность, но он также не работал для меня

4. Что теперь?

Я могу создать пользовательский атрибут, но у меня есть модель в отдельной библиотеке, поэтому я не могу вставить туда свой репозиторий для проверки уникальности. По этой же причине я не могу использовать такую ​​библиотеку, как FluentValidation. Я верю, что есть простая причина, почему мое действие не стреляет. Я прошу вас о помощи.

+0

Вы установили атрибут Authorize с атрибутом Authorize, а DictionaryNameExists также находится в этом контроллере, поэтому это не должно быть проблемой? – Mairaj

+0

Это была моя первая мысль, поэтому я использовал [AllowAnonymous] для моего метода. Это не помогло. Но спасибо за ваше время. –

ответ

0

Поскольку ваш контент загружен после вызова проверки. После загрузки частичного представления вам необходимо вызвать проверку и разбор.

$.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) {}); не внутри этой конструкции. –

Смежные вопросы