【问题标题】:Dynamic "Favorite" button - ASP.NET MVC动态“收藏”按钮 - ASP.NET MVC
【发布时间】:2017-10-13 02:43:52
【问题描述】:

我创建了一个使用“无限加载”过程动态生成记录的表格,我的 HTML 代码中有一个按钮,我需要使用它来允许用户将项目添加到他们的收藏夹中 - 所以这是我的 HTML 代码

@model List<PagesAuth.Models.Links.MLink>

@foreach (var I in Model)
{
    <tr> 
        <td class="v-align-top" id="itemcard">                
            <h4 class="card-title">
                @I._title 
                <small><cite>@I._tp_created.ToString("dd MMM yyyy")</cite> /small>
            </h4>            
            <div class="pull-right" id="options">
                <ul class="list-inline text-right" >                   
                    @if (I._tp_favourite == 0)
                    {
                    <li><button class="btn-link glyphicon glyphicon-heart-empty" onclick="location.href='@Url.RequestContext .Action("_Fav", "Home", "@I._id")'"></button></li>
                    }
                    else
                    {
                  <li><button class="btn-link glyphicon glyphicon-heart-empty" onclick="location.href='@Url.RequestContext .Action("_UnFav", "Home", "@I._id")'"></button></li>
                    }
                </ul>
            </div>    
        </div>

        </td>
    </tr>
}

我正在尝试使用“收藏夹”按钮来允许用户将该网站添加到他们的收藏列表中(我对数据库更新等表示满意)

<ul class="list-inline text-right" >                   
                    @if (I._tp_favourite == 0)
                    {
                    <li><button class="btn-link glyphicon glyphicon-heart-empty" onclick="location.href='@Url.RequestContext .Action("_Fav", "Home", "@I._id")'"></button></li>
                    }
                    else
                    {
                  <li><button class="btn-link glyphicon glyphicon-heart-empty" onclick="location.href='@Url.RequestContext .Action("_UnFav", "Home", "@I._id")'"></button></li>
                    }
                </ul>
  • 我想知道的是如何在用户前端实现这一点 - 就像我认为我应该只在我的控制器中创建一个 PartialView 并使其成为子操作,发送它 ID 并进行 DB 处理

    [ChildActionOnly]
    
    public ActionResult _Fav(int ID)
    
    {//Do DB Processing    
    
    
        return PartialView(ID);
    
    }
    

首先以下不起作用

onclick="location.href='@Url.RequestContext .Action("_UnFav", "Home", "@I._id")'"

其次,如果我最终完成了这项工作,它仍然会刷新页面,我不希望这样。

有没有更好的方法来实现这一点

干杯

【问题讨论】:

  • 我建议使用 ajax 在按钮单击时发送请求。从那里你可以处理结果。如果成功,执行ui更改以指示favourite,否则什么也不做。
  • 我也环顾四周,人们确实在谈论使用 SignalR,但是对于这个小东西,我不想使用 SignalR。
  • @JohnEphraimTugado 我应该将请求发送到哪里,我的控制器的部分视图或只是一个简单的类,以及 UI 更改将如何在 AJAX 中发生
  • 为什么要使用局部视图?你会展示什么?

标签: c# jquery asp.net-mvc razor


【解决方案1】:

我不知道你为什么要使用局部视图,但你可以这样做。

  1. 使用 ajax 向控制器操作发送请求。
  2. 使用 JavaScript 处理操作结果。

查看:

@model List<PagesAuth.Models.Links.MLink>

@foreach (var I in Model)
{
    <tr> 
        <td class="v-align-top" id="itemcard">                
            <h4 class="card-title">
                @I._title 
                <small><cite>@I._tp_created.ToString("dd MMM yyyy")</cite> /small>
            </h4>            
            <div class="pull-right" id="options">
                <ul class="list-inline text-right" >                   
                    @if (I._tp_favourite == 0)
                    {
                        <li><button class="btn-link glyphicon glyphicon-heart-empty" onclick="Fav(@I._id)"></button></li>
                    }
                    else
                    {
                        <li><button class="btn-link glyphicon glyphicon-heart-empty" onclick="UnFav(@I._id)"></button></li>
                    }
                </ul>
            </div>    
        </div>

        </td>
    </tr>
}

JS:

在这里,我只是提醒最喜欢的操作成功了,否则您需要处理一系列字符串错误。您可以根据自己的喜好重定向或做一些事情。

<script type="text/javascript">

    function Fav(id) {
        var url = '@Url.Action("_Fav", "Home")';

        $.ajax({
            url: url,
            type: 'POST',
            data: {
                id: id
            },
            success: function (data) {
                if(data.length == 0) // No errors
                    alert("Fave success!");
            },
            error: function (jqXHR) { // Http Status is not 200
            },
            complete: function (jqXHR, status) { // Whether success or error it enters here
            }
        }); 
    };

    function UnFav(id) {
        var url = '@Url.Action("_UnFav", "Home")';

        $.ajax({
            url: url,
            type: 'POST',
            data: {
                id: id
            },
            success: function (data) {
                if(data.length == 0) // No errors
                    alert("Unfave success!");
            },
            error: function (jqXHR) { // Http Status is not 200
            },
            complete: function (jqXHR, status) { // Whether success or error it enters here
            }
        }); 
    };

</script>

控制器:

[HttpPost]
public ActionResult _Fav(int ID)
{
    List<string> errors = new List<string>(); // You might want to return an error if something wrong happened

    //Do DB Processing   

    return Json(errors, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public ActionResult _UnFav(int ID)
{
    List<string> errors = new List<string>(); // You might want to return an error if something wrong happened

    //Do DB Processing   

    return Json(errors, JsonRequestBehavior.AllowGet);
}

【讨论】:

  • 好的,这很有意义,非常感谢你,虽然由于某种原因我无法触发点击动作&lt;li&gt;&lt;button class="btn-link glyphicon glyphicon-heart-empty" onclick="Fav(@I._id)"&gt;&lt;/button&gt;&lt;/li&gt;,脚本为@section script {},并且还增加了对AJAX的引用在顶部&lt;script src="~/Scripts/jquery.unobtrusive-ajax.js"&gt;&lt;/script&gt;
  • 从 `@section script {}` 部分删除脚本解决了这个问题 :) 非常感谢您的帮助 ...
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多