【问题标题】:MVC 4 Razor using Ajax forms to update a foreach loopMVC 4 Razor 使用 Ajax 表单更新 foreach 循环
【发布时间】:2013-10-28 02:49:47
【问题描述】:

从哪里开始...我可以在 Internet 上找到类似的东西,但它们似乎与我想做某事的特定方式不相符。我尝试过使用和不使用局部视图,但收效甚微。

简要说明:我有一个带有 Ajax 表单的强类型视图。在表单下方,我有一个重复代码块的 foreach 循环。我需要能够从表单选择(过滤器)更新代码块。

这是我的观点,“FindATeacher.cshtml”,就目前而言(在尝试了许多不同的想法之后):

@model Teachers.Models.OmniModel
@{
    ViewBag.Title = "FindATeacher";
    Layout = "~/Views/Shared/_Layout.cshtml";

}
<h2>Find a Teacher</h2>
@using (Ajax.BeginForm("FilterTeachers", "Home", new AjaxOptions { HttpMethod = "Post", OnSuccess = "onSuccess" }))
{
    <div id="ContentFilter">
        <div class="filterLabels">
            <p>Search by Name</p>
            <p>Filter By Instrument</p>
            <p>Filter By City</p>
        </div>
        <div class="filterObjects">
            <p>
                <input type="text" id="nameTXT" />
                <button type="submit" id="findButton">find</button>
            </p>
            <p>@Html.DropDownList("InstrumentID", (SelectList)Model.Instruments, "-- Select an Instrument --", new { id = "instrumentDD" })</p>
            <p>@Html.DropDownList("CityID", (SelectList)Model.Cities, "-- Select a City --", new { id = "cityDD" })</p>
        </div>
    </div>
}
<hr />
@foreach (var r in Model.Teachers)
{
    <div id="ContentResults">
        <div id="avatar">
            <img src="i" />
        </div>

        <div id="demographics">
            <h6>@r.Teacher</h6>
            <strong>@r.StudioName</strong>
            <p><a href="#">@r.URL</a></p>
            <p>@r.StreetAddress</p>
            <p>@r.City, @r.AddressStateID @r.Zip</p>
            <p>@r.Phone</p>
            <p>@r.EmailAddress</p>
        </div>
        <div id="studioDetails">
            <p><strong>Instrument(s) Taught</strong></p>
            <p>
                @{
    var instrumentString = r.Instruments.Aggregate("", (a, b) => a + b.Instrument + ", ");
    if (instrumentString.Length != 0)
    {
        instrumentString = instrumentString.Remove(instrumentString.LastIndexOf(","));
    }
                }
                @instrumentString
            </p>
            <br />

            @if (r.Information != "" && r.Information != null)
            {
                <p><strong>Information</strong></p>
                <p>@r.Information</p>
            }
        </div>
    </div>
}

现在这是我的控制器。我在控制器中正确地得到了结果,只是没有更新代码块:

public ActionResult FindATeacher()
        {
            Model.Instruments = new SelectList(TeacherService.GetInstrumentList(0),"InstrumentID","Instrument");
            Model.Cities = new SelectList(TeacherService.GetCityList(),"CityID","City");
            Model.Teachers = TeacherService.GetTeacherList("", 0);
            return View(Model);
        }

        [HttpPost]
        public JsonResult FilterTeachers(String teacherName, String instrumentID, String cityID)
        {
            Model.Teachers = TeacherService.GetTeacherList("John", 0, 0);
            return Json(Model.Teachers);
        }

谢谢。

【问题讨论】:

    标签: ajax asp.net-mvc jquery asp.net-mvc-4 razor


    【解决方案1】:

    @VishalVaishya 提出了正确的想法,但有一种更简单的方法,它不涉及自定义 javascript 代码:AjaxOptions 有一个 UpdateTargetId 属性,AJAX 工具包将解释该属性意味着您希望使用发送的结果更新给定目标从控制器返回。

    FindATeacher.cshtml:

    @using (Ajax.BeginForm("FilterTeachers", "Home", new AjaxOptions { 
        HttpMethod = "Post", UpdateTargetId = "TeacherList" }))
    {
        ...
    }
    <hr />
    <div id="TeacherList">
        @Partial("TeacherList", Model.Teachers)
    </div>
    

    TeacherList.cshtml

    @model IEnumerable<Teacher>
    @foreach(var teacher in Model)
    {
       ...
    }
    

    控制器动作:

        [HttpPost]
        public ActionResult FilterTeachers(String teacherName, String instrumentID, String cityID)
        {
            Model.Teachers = TeacherService.GetTeacherList(teacherName, instrumentID, cityID);
            return PartialView("TeacherList", Model.Teachers);
        }
    

    【讨论】:

    • TeacherList.cshtml 不是局部视图吗?在控制器中应该是return PartialView("TeacherList", Model.Teachers); ?
    • @Haritha:是的,我解决了这个问题。谢谢。
    • 不幸的是,这不起作用。当我单击发送按钮时,我没有收到错误消息,但我也没有得到我应该得到的结果。没有任何变化。
    • @user1842909:使用浏览器的开发工具检查网络流量和 JavaScript 控制台。部分视图是否在 AJAX 调用中呈现并返回?是否有任何错误被记录到控制台?
    • @StriplingWarrior 我没有尝试过,但是动作参数是否匹配我的意思是从表单中发布 3 个参数?或者在行动中我们应该使用教师模型来捕捉它?
    【解决方案2】:

    你可以试试下面的方法:

    将您的 foreach 循环分离到另一个局部视图中。 并在过滤器/单击事件上加载您的部分视图,并将过滤后的参数传递给您的控制器操作。

    JS 更改事件代码会是这样的:

    var teacherName = ''; //get your selected teachername
    var instrumentID = ''; //get your selected instrumentid
    var cityID = ''; //get your selected city id
    
    var url = '@Url.Action("FilterTeachers", "ControllerName", new { teacherName = "teacher-Name", instrumentID="instrument-ID", cityID="city-ID" })';
    
    url = url.replace("teacher-Name", teacherName).replace("instrument-ID", instrumentID).replace("city-ID", cityID);
    
    $('#result').load(url);
    

    【讨论】:

    • 鉴于以上似乎不起作用,除非弹出另一个解决方案,否则我今天将不得不尝试这个。在上面的解决方案中,在初始创建时,我有两个条目。部分控制器在过滤器上返回一个条目,但两个条目继续显示。希望这第一个解决方案 Vishal wote 有效:-)
    • 没试过这个,因为 Stripling 的效果很好。
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2021-08-16
    相关资源
    最近更新 更多