【问题标题】:Refresh ViewComponent in ASP.Net Core MVC View在 ASP.Net Core MVC 视图中刷新 ViewComponent
【发布时间】:2020-03-09 20:51:16
【问题描述】:

我有一个视图组件,EventsViewComponent,它使用以下代码行加载到我的事件视图 index.cshtml 中:

<div id="events">
    @await Component.InvokeAsync("Events", new { showPrevious = Model.ShowPrevious, showUpcoming = Model.ShowUpcoming })
</div>

我添加了两个这样的复选框:

@Html.CheckBoxFor(m => m.ShowPrevious, new { id = "cbShowPrevious", onchange = "ReloadEvents()" })
@Html.CheckBoxFor(m => m.ShowUpcoming, new { id = "cbShowUpcoming", onchange = "ReloadEvents()" })

ReloadEvents() 指的是一个 Javascript 函数,我希望在其中使用 Ajax 调用来刷新 EventsViewComponent,如下所示:

function ReloadEvents() {
    $.ajax({
        url: '@Url.Action("ReloadEvents", "Events")',
        data: {
            showPrevious: document.getElementById("cbShowPrevious").checked,
            showUpcoming: document.getElementById("cbShowUpcoming").checked
        },
        success: DoThis()
    })
}

function DoThis() {
    const eventsDiv = document.getElementById('events');
    eventsDic.innerHTML = //HTML from EventsViewComponent
}

但我似乎无法从 EventsViewComponent 获取 HTML。

我已经为 EventsViewComponent 编写了 Default.cshtml,如下所示:

@{
    List<Event> events = ViewData["Events"] as List<Event>;
    if (events.Count > 0)
    {
        <table>
            //event data from the model
        </table>
    }
}

EventsViewComponent 中的 InvokeAsync 方法被命中,EventsController 中的 ReloadEvents 方法也是如此,但我显然误解了一些东西,因为我似乎无法更新 EventsViewComponent。

请有人建议这是否可能以及如何实现它?

【问题讨论】:

    标签: javascript asp.net-mvc asp.net-core asp.net-core-viewcomponent


    【解决方案1】:

    要从 EventsViewComponent 获取 HTML,您需要进行如下更改:

    success: function (data) {
            $("#events").html(data);
    }
    

    这是一个完整的工作演示,如下所示:

    1.型号:

    public class Event
    {
        public bool ShowPrevious { get; set; }
        public bool ShowUpcoming { get; set; }
        public string Data { get; set; }
    }
    

    2.ViewComponent:

    public class EventsViewComponent : ViewComponent
    {
        List<Event> data = new List<Event>() {
            new Event(){ ShowPrevious=true,ShowUpcoming=false,Data="aaa"},
            new Event(){ ShowPrevious=false,ShowUpcoming=true,Data="bbb"},
            new Event(){ ShowPrevious=false,ShowUpcoming=true,Data="ccc"},
        };
        public IViewComponentResult Invoke(bool showPrevious,bool showUpcoming)
        {
            if (showPrevious == true && showUpcoming == true)
            {
                ViewData["Events"] = data;
            }
            else if (showPrevious)
            {
                ViewData["Events"] = data.Where(u => u.ShowPrevious == true).ToList();
            }
            else if(showUpcoming)
            {
                ViewData["Events"] = data.Where(u => u.ShowUpcoming == true).ToList();
            }
            return View();
        }
    }
    

    3.控制器:

    public class HomeController : Controller
    {
    
        public IActionResult ReloadEvents(bool showPrevious, bool showUpcoming)
        {
            return ViewComponent("Events", new { showPrevious = showPrevious, showUpcoming = showUpcoming });
        }
        public IActionResult Index()
        {
            var model = new Event() { ShowPrevious = true, ShowUpcoming = true };
            return View(model);
        }
    }
    

    4.Index.cshtml:

    @model Event
    @Html.CheckBoxFor(m => m.ShowPrevious, new { id = "cbShowPrevious", onchange = "ReloadEvents()" })
    @Html.CheckBoxFor(m => m.ShowUpcoming, new { id = "cbShowUpcoming", onchange = "ReloadEvents()" })
    <div id="events">
        @await Component.InvokeAsync("Events", new { showPrevious = Model.ShowPrevious, showUpcoming = Model.ShowUpcoming })
    </div>
    
    @section Scripts
    {
    <script>
        function ReloadEvents() {
            $.ajax({
            url: '@Url.Action("ReloadEvents", "Home")',
            data: {
            showPrevious: document.getElementById("cbShowPrevious").checked,
            showUpcoming: document.getElementById("cbShowUpcoming").checked
                },
                success: function (data) {
                    $("#events").html(data);
                }
            })
    } 
    </script> 
    }
    

    5.Default.cshtml(视图组件Razor视图):

    @model Event
    @{
        List<Event> events = ViewData["Events"] as List<Event>;
        if (events.Count > 0)
        {
            <table>
                <tr>
                    <th>ShowPrevious</th>
                    <th>ShowUpcoming</th>
                    <th>Data</th>
                </tr>
                <tbody>
                    @foreach (var item in events)
                    {
                        <tr>
                            <td>@item.ShowPrevious</td>
                            <td>@item.ShowUpcoming</td>
                            <td>@item.Data</td>
                        </tr>
                    }
    
                </tbody>
            </table>
        }
    }
    

    结果:

    【讨论】:

    • 谢谢,瑞娜。看起来我所缺少的只是成功函数调用。非常感谢您的帮助,我现在可以正常工作了。
    【解决方案2】:

    我已经在我的一个项目中实现了这样的解决方案,请查看 -> Refreshing .Net core MVC ViewComponent over AJAX

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-12
      • 2021-10-27
      • 1970-01-01
      • 2021-08-25
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多