0

この星評価プラグイン をMVC4アプリケーションで使用したいと思います。私はこのような評価表を持っています:

 public class Rating
    {
        public int FromUserId { get; set; }
        public int ToProductId { get; set; }
        public int RateValue { get; set; }
    }

私はこのような行動をとっています:

public ActionResult SubmitRating(int fromUserId, int toProductId , int rateValue )
   {
       return View();
   }

FromUserIdで あり@WebSecurity.CurrentUserIdToProductIdModel.Id

ajaxに問題があります。RateValueをアクションに送信する必要があります。選択した値をコントローラーのSubmitRatingアクションに送信し、逆に、コントローラーからビューに回答を送り返す(選択した値を表示する、ユーザーにメッセージを表示するなど)にはどうすればよいですか?

これは動作しません。ここにajaxコードを書く方法は?

$(function(){
    $('#star-rating').rating(function(vote, event){
        $.ajax({
            url: "@Url.Action("SubmitRating", "MyController")",
            type: "GET",
            data: {rateValue : vote},
        });
    });
});
4

1 に答える 1

2

いくつかのことを仮定しましょう:

HTMLの製品IDは次のとおりです。

<div id="star-rating" data-pid="@Model.Id">
    <input type="radio" name="example" class="rating" value="1" />
    <input type="radio" name="example" class="rating" value="2" />
    <input type="radio" name="example" class="rating" value="3" />
    <input type="radio" name="example" class="rating" value="4" />
    <input type="radio" name="example" class="rating" value="5" />
</div>

そのため、ページごとに1つの商品だけでなく、商品のリストを作成できます。

現在ログインしているユーザーIDと同じである場合、ユーザーIDを渡すことはセキュリティ慣行ではありません。現在のセッションからユーザーIDを取得するだけでよいため、コントローラーに次のようになります。

public class ServicesController : Controller
{
    public ActionResult RateProduct(int id, int rate)
    {
        int userId = WebSecurity.CurrentUserId;
        bool success = false;
        string error = "";

        try
        {
            success = db.RegisterProductVote(userId, id, rate);
        }
        catch (System.Exception ex)
        {
            // get last error
            if (ex.InnerException != null)
                while (ex.InnerException != null)
                    ex = ex.InnerException;

            error = ex.Message;
        }

        return Json(new { error = error, success = success }, JsonRequestBehavior.AllowGet);
    }
}

このようにして、次のようにレートを簡単に呼び出すことができます。

<script>
    $(function () {

        $('#star-rating').rating(function (vote, event) {
            var anchor = $(event.currentTarget),
                pid = anchor.closest(".ratting-item").data("pid"),
                url = '@Url.Action("RateProduct", "Services")';

            // show a loading div that would have a animated gif
            $(".loading").show();

            $.ajax({
                url: url,
                type: "GET",
                data: { rate: vote, id: pid },
                success: function (data) {
                    if (data.success) {
                        // all went well, here you can say Thank you

                    }
                    else {
                        // There must be an Exception error, let's show it

                    }
                },
                error: function (err) {
                    // the call thrown an error
                },
                complete: function () {
                    $(".loading").hide();
                }
            });
        });

    });
</script>

更新しました

$(this)は正しい要素を返さないためevent、呼び出しで渡されるプロパティを使用する必要があります。

したがって、これに変更する必要があります。

var anchor = $(event.currentTarget),
    pid = anchor.closest(".ratting-item").data("pid"),
    url = '@Url.Action("RateProduct", "Services")';

単純console.log($(this))console.log(event);、さらに、Fiddlerを起動すると、何が欠落しているかがわかり、返された呼び出しのエラーも表示されます。

GITのプロジェクト例

このプロジェクトが機能しているソースコードは次のとおりです:https //github.com/balexandre/Stackoverflow-Question-14014091

于 2012-12-23T21:24:50.227 に答える