Проблемы с удаленной проверкой Asp.net MVC 3 - PullRequest
0 голосов
/ 13 марта 2012

Каждый раз, когда в моей форме запускается удаленная проверка, я получаю следующий URL-адрес ... не то, что я ожидал: http://localhost:13927/Validation/ValidateAnswer?%5B0%5D.Episodes%5B0%5D.Questions%5B0%5D.Answers%5B0%5D.AnswerText=undefined&%5B0%5D.Episodes%5B0%5D.Questions%5B0%5D.Answers%5B0%5D.Id=undefined

Контроллер верный. Действие правильное, но параметры не соответствуют ожиданиям. Любые идеи относительно того, как я могу это исправить? Подпись для действия проверки: public JsonResult ValidateAnswer(string answerText, int id).

Вот модель:

public class Answer
{
    public int Id { get; set; }
    [Required(ErrorMessage = "Please enter an answer.")]
    [Remote("ValidateAnswer", "Validation", AdditionalFields = "Id")]
    public string AnswerText { get; set; }
}

Вот страница:

@using (Html.BeginForm("/", "Home", FormMethod.Post, new {id="frm"}))
    {
        for (var p = 0; p < Model.Count; p++)
        {
            <div class="hidden questions" id="@Model[p].Id">
                @for (var i = 0; i < Model[p].Episodes.Count; i++)
                {
                    <div class="even" style="margin-top: 15px; padding: 15px;">
                        @Html.EditorFor(model => model[p].Episodes[i])
                    </div>
                }
            </div>
        }
    }

Вот ссылка на редактор:

<h3 style="margin: 0; margin-bottom: 15px;">@Model.EpisodeType, which started on @Model.StartDate and ended on @Model.EndDate</h3>
@Html.HiddenFor(model=>model.Id)
@for (var i = 0; i < Model.Questions.Count; i++ )
{
    <p style="margin: 0; margin-bottom: 5px;">
        <span style="font-weight: bold; font-size: 1.1em">@Model.Questions[i].QuestionText</span><br/>
    </p>
    <p style="margin: 0; margin-bottom: 10px;">
        @{ var theClass = string.Concat("autocomplete", Model.Questions[i].IsYesNo ? "yesno" : Model.Questions[i].IsTime ? "time" : ""); }
        @Html.TextBoxFor(model=>model.Questions[i].Answers[0].AnswerText, new {@class=theClass, question=Model.Questions[i].Id.ToString()})
        @Html.ValidationMessageFor(model=>model.Questions[i].Answers[0].AnswerText)        
        @Html.HiddenFor(model => model.Questions[i].Id)
    </p>
}

1 Ответ

0 голосов
/ 09 мая 2012

У меня была такая же проблема. В конечном итоге я отследил его до строки 309 в jquery.validate.unobtrusive.js:

return $(options.form).find(":input[name='" + paramName + "']").val();

Этот вызов jQuery возвращает 0 объектов, возможно, из-за того, что фильтруемое имя (ваше входное имя) содержит квадратные скобки, что приводит в замешательство анализатор jQuery.

Вы можете исправить это, заменив его следующей строкой:

return $(options.form).find(":input[id='" + options.element.id + "']").val();

Выше приведена фильтрация по идентификатору, так что никаких странных символов для запуска jQuery нет.

...