Как получить полное имя поля Html для элемента в списке на моей модели на уровне контроллера?

*Первый пост

У меня есть обработчик ошибок JQuery для моих сообщений Ajax, который я должен использовать, он добавляет ошибку в html на основе имени поля для этого элемента, как это

$(document).ready(function () {
function myHandler(e, error) {
    var tag = "";
    if (error.Success == true) { $('.field-validation-error').remove(); return; } // if success remove old validation and don't continue
    if (error.Success == false) { $('.field-validation-error').remove(); } // if success remove old validation and continue
    for (i = 0; i < error.Errors.length; i++) {
        var t = error.Errors[i];
        //get error key and assign it to id
        tag = t.Key;
        //clear down any existing json-validation
        for (j = 0; j < t.Value.length; j++) {
            //this part assumes that our error key is the same as our inputs name
            $('<span class="field-validation-error">' + t.Value[j].ErrorMessage + '</span>').insertAfter('input[name="' + tag + '"], textarea[name="' + tag + '"], select[name="' + tag + '"], span[name="' + tag + '"]');
        }
    }
}


$.subscribe("/******/errors", myHandler);

});

Это работает отлично из коробки с нашей быстрой установкой проверки, пока я не попытаюсь добавить пользовательскую ошибку состояния модели на уровне контроллера следующим образом:

foreach (var item in model.Locations)
        {
            var cityRepos = new CityRepository(NhSession);
            var cityItem = cityRepos.GetAll().FirstOrDefault(o => o.Country.Id == item.CountryID && o.Name == item.City);
            if (cityItem == null)
                item.City
                ModelState.AddModelError("City", string.Format(@"The city ""{0}"" was not found, please ensure you have spelt it correctly. TODO: add a mail to link here with city not found subject", item.City));
        }

проблема в том, что ошибка состояния модели должна быть присоединена к имени html-поля, а не к моей волшебной строке "City". Свойство html name является MVC Generated и выглядит примерно так:

 name="Locations[0].City"

Я сталкивался с этой проблемой в html помощнике и использовал метод:

.GetFullHtmlFieldName(
                                                 ExpressionHelper.GetExpressionText(propertySelector)
                                             );

что решило мою проблему в этом случае.

У меня вопрос: могу ли я использовать этот метод в свойстве модели в пост-действии MVC, чтобы получить свойство html name, из которого оно получено?

заранее спасибо

1 ответ

Решение

Хорошо, так что это не идеально, но я реализовал этот метод Helper, пока не смогу найти лучшее решение, не включающее магические строки:

public static class ModelStateErrorHelper
{
    public static string CreateNameValidationAttribute(string collectionName, int index, string propertyName)
    {
        string template = "{0}[{1}].{2}";
        return string.Format(template, collectionName, index.ToString(), propertyName);
    }

}
Другие вопросы по тегам