【问题标题】:MVC3 ajax return new viewMVC3 ajax 返回新视图
【发布时间】:2014-11-11 03:49:20
【问题描述】:

我有一些代码显示一个带有数据库条目列表的保管箱,并在 change 事件上调用控制器操作。控制器将所选条目作为字符串并返回一个新视图(我认为这就是我的问题),问题是我认为旧视图仍然存在,因为新返回的视图永远不会显示。

我是否需要重新设计这个,如果不需要,我是否应该强行破坏任何旧视图?

我的代码如下:

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);
    }

【问题讨论】:

  • 你想重定向到你对控制器的ajax命中视图吗?
  • 是 - 如果您的意思是用户更改下拉选择,控制器然后查询选择并返回包含相关选择数据的新视图?谢谢

标签: asp.net-mvc-3 jquery


【解决方案1】:

不要在onchange上做ajax,而是在下面做

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

注意:您可能必须提供完整路径 url 而不是相对 url。

【讨论】:

  • 谢谢。从那以后,我意识到我的整个想法从根本上是错误的,因为我试图使用 Ajax 来完成它并非旨在完成的工作。不过,我感谢您的意见,并且您的解决方案符合我的目的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
相关资源
最近更新 更多