2013-06-29 2 views
1

У меня есть код, который отображает dropbox со списком записей из базы данных и вызывает действие контроллера на событии change. Контроллер берет выбранную запись в виде строки и возвращает новое представление (я думаю, что в этом моя проблема), проблема в том, что старый взгляд по-прежнему сохраняется, поскольку вновь возвращенное представление никогда не отображается.MVC3 ajax return new view

Нужно ли мне перепроектировать это или нет, следует ли насильственно уничтожить любой старый вид?

Мой код выглядит следующим образом:

EditSchool вид:

@model namespace.Models.SchoolDetails 
@{ 
    ViewBag.Title = "EditSchool"; 
    Layout = "~/Views/AuthorisedAdmin/_LayoutAdmin.cshtml"; 
} 

<script src="@Url.Content("~/Scripts/chosen/chosen.jquery.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/bubble-popup-chosen-upload-functions.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

<script language="javascript" type="text/javascript"> 
    $(document).ready(function() { 
     $("#School").change(function() { 
      var SelectedSchool = $('#School').val(); 
      $.ajax({ 
       url: '/AuthorisedAdmin/RetrieveSchool' 
       , type: 'POST' 
       , data: { School: SelectedSchool } 
       , success: function (data) { 
       } 
       , error: function (request, textStatus, errorThrown) { 
        alert(errorThrown.toString()); 
       } 
       , complete: function (request, textStatus) { 
       } 
      }); 
     }); 
    }); 
</script> 

<fieldset> 
    <legend>Select School</legend> 
    <div class="editor-field"> 
     @Html.DropDownList("School", ViewBag.RegisteredSchools as SelectList, namespace.Models.Helpers.LanguageSchoolsConstants.m_sDropdownDisplayText, 
      new 
      { 
       id = "School", 
       @class = "chosen", 
      }) 
    </div> 
</fieldset> 

@{ 
    if (null != Model) 
    { 
     @Html.Partial("Partial/EditSchoolPartial", Model) 
    } 
    else 
    { 
     @Html.Partial("Partial/NoSchoolSelected") 
    }  
} 

Обратите внимание, что частичный вид (EditSchoolPartial), вероятно, не является проблемой здесь, так что я не отправляя код.

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

EditSchool действие:

public ActionResult EditSchool() 
{ 
    List<string>kRegisteredSchools = DBHelperFunctionsSchool.Instance().GetRegisteredSchoolsNamesOnly(); 
    ViewBag.RegisteredSchools = new SelectList(kRegisteredSchools, "Name"); 
    SchoolDetails schoolDetails = null;//DBHelperFunctionsSchool.Instance().GetSchoolDetailsForName(kRegisteredSchools.FirstOrDefault()); 
    return View(schoolDetails); 
} 

RetrieveSchool действие (вызывается AJAX):

[HttpPost] 
    public ActionResult RetrieveSchool(string School) 
    { 
     SchoolDetails schoolDetails = null; 
     List<string> kRegisteredSchools = DBHelperFunctionsSchool.Instance().GetRegisteredSchoolsNamesOnly(); 
     ViewBag.RegisteredSchools = new SelectList(kRegisteredSchools, "Name"); 

     try 
     { 
      schoolDetails = new SchoolDetails(); 
      schoolDetails.School = DBHelperFunctionsSchool.Instance().GetSchoolForName(School); 
      DBHelperFunctionsSchool.Instance().PopulateSchoolDetailsSuppData(schoolDetails); 
      schoolDetails.ActionNameToExecuteOnFormSubmit = "EditSchoolDetails"; 
      schoolDetails.ControllerNameToExecuteOnFormSubmit = "AuthorisedAdmin"; 
     } 
     catch 
     { 
      schoolDetails = null; 
     } 
     finally 
     { 
     } 

     return View("EditSchool", schoolDetails); 
    } 
+0

Вы хотите перенаправить на свой взгляд на ajax-хит вашего контроллера? – harrybvp

+0

Да. Если вы имеете в виду, что пользователь выбирает выпадающий список, контроллер затем запрашивает выбор и возвращает новое представление с соответствующими данными выбора? Спасибо – Yos

ответ

1

Вместо того чтобы делать Ajax на OnChange, сделайте ниже

$("#School").change(function() { 
     var SelectedSchool = $('#School').val(); 
     window.location='/AuthorisedAdmin/RetrieveSchool?School='+SelectedSchool; 
    }); 

Примечание. Возможно, вам придется указать полный URL-адрес пути вместо относительного URL-адреса.

+1

Спасибо. С тех пор я понял, что вся моя идея в корне неверна, поскольку я пытаюсь использовать Ajax для выполнения работы, которую она не предназначена. Я ценю ваш вклад, хотя и ваше решение для моих целей. благодаря – Yos