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. Я верю, что есть простая причина, почему мое действие не стреляет. Я прошу вас о помощи.
Вы установили атрибут Authorize с атрибутом Authorize, а DictionaryNameExists также находится в этом контроллере, поэтому это не должно быть проблемой? – Mairaj
Это была моя первая мысль, поэтому я использовал [AllowAnonymous] для моего метода. Это не помогло. Но спасибо за ваше время. –