2013-08-21 2 views
-1

У меня проблема с переменной, принимающей значение undefined.Почему переменная URL не определена?

В файле Create.cshtml я есть:

@using (Html.BeginForm("Create", "Enrollment", FormMethod.Post, new 
{ 
    id = "YearCourseFormId", 
    data_courseListAction = @Url.Action("CourseList") 
})) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Enrollment</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.StudentId, "Student") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("StudentId", ViewBag.Student as SelectList, String.Empty, new { @class = "chosen-select", data_placeholder = "Please Select a Student...",style="width:350px;" }) 
     @Html.ValidationMessageFor(model => model.StudentId) 
    </div> 


    <div class="editor-label"> 
     @Html.LabelFor(model => model.Course.YearId, "Year") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("YearId", ViewBag.Year as SelectList, String.Empty, new { @class = "chosen-select", data_placeholder = "Please Select a Year...",style="width:250px;" }) 
     @Html.ValidationMessageFor(model => model.Course.YearId) 
    </div> 


    <div class="editor-label"> 
     @Html.LabelFor(model => model.CourseId, "Course") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("CourseId", String.Empty) 
     @Html.ValidationMessageFor(model => model.CourseId) 
    </div> 


    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 

}

В файле Jquery я есть:

$(function() { 

$('#YearId').change(function() { 
    var URL = $('#YearCourseFormId').data('courseListAction'); 
    alert(URL); 
    $.getJSON(URL + '/' + $('#YearId').val(), function (data) { 
     var selectList = $("#CourseId"); 
     selectList.empty(); 
     var option = $('<option>'); 
     selectList.append(option); 
     $.each(data, function (index, optionData) { 
      option = $('<option>').text(optionData.Text).val(optionData.Value); 
      selectList.append(option); 
     }); 

    }); 
}); 

}); 

В этой части alert(URL); результат не определен.

В EnrollmentController.cs я есть:

public ActionResult CourseList(string ID) 
    { 
     int Year = int.Parse(ID); 
     var courses = from s in db.Courses 
          where s.YearId == Year 
          select s; 

     if (HttpContext.Request.IsAjaxRequest()) 
      return Json(new SelectList(
          courses.ToArray(), 
          "Id", 
          "CourseName") 
         , JsonRequestBehavior.AllowGet); 

     return RedirectToAction("Index"); 
    } 

Но этот метод не вызывается из-за ошибки.

В чем проблема?

+2

Нам нужно будет увидеть html '# YearCourseFormId', я подозреваю, что вы неправильно создали атрибут dataAttribute как' data-courseListAction = "somevalue", а не 'data-course-list-action =" somevalue "' –

+0

Этот код серьезно неполна. Что такое 'data_courseListAction'? Что ты делаешь с этим? Как выглядит визуализированный HTML, отправленный в браузер? –

+1

@KevinB: Ах, да, еще одна жертва ненужной магии данных «jQuery» ... Я забыл эту определенную морщину. –

ответ

4

Ваша форма визуализируется как это:

<form action="/Enrollment/Create" data-courselistaction="..." id="YearCourseFormId" method="post"> 

</form> 

Вы можете получить доступ с помощью любого из них:

$('#YearCourseFormId').data('courselistaction'); 
$('#YearCourseFormId').attr('data-courselistaction'); 
$('#YearCourseFormId').attr('data-courseListAction'); 

Учитывая T.J. Замечания Броудера о причудах с data(), вероятно, было бы безопаснее пойти с одним из решений attr().

Edit - Участок утолщается ..

Chrome inspecter:

inspecter

Источник:

source

Я не уверен, что последствия, которые, но мой фрагмент javascript действительно работал, чтобы получить значение.

+0

* «Ваша форма визуализируется следующим образом» * Вы уверены? Вы уверены, что это не отображается с помощью data-courseListAction = "..."?? Потому что это [показывает то же поведение данных] (http://jsbin.com/OyAs/2). (Решение работает, я просто задаю вопрос об утверждении выше него.) –

+1

@ T.J.Crowder Да, я просто вставил код в проект, над которым я работаю. Все мои быстрые изменения касались удаления вещей, связанных с моей конкретной средой. –

+0

Прохладный, хорошая работа. –

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