如何在MVC中调用和处理javascript中的codebehind函数

时间:2017-08-17 19:27:27

标签: javascript c# asp.net-mvc

在我的项目视图中,我从控制器获得了一个带有ajax的字符串变量,我希望使用名为'MakeSeoUrl'的代码隐藏函数处理此字符串,然后将此处理后的值放入名为'titleURL'的变量中。

我认为它可以用作'@ MVCHelper.RouteHelper.MakeSeoUrl(response.BlogEntries [i] .Title);'但这是错误的,它说“回应”不存在。我该怎么办?如何使用javascipt codebehind函数。

观看

$.ajax({
                    url: "/Map/GetBlogEntries",
                    type: "post",
                    datatype: "json",
                    data: placeMarker,
                    success: function (response) {
                        if (response.Success) {                                
                            var titleURL;
                            for(var i = 0; i < response.BlogEntries.length ; i ++){
                                titleURL =@MVCHelper.RouteHelper.MakeSeoUrl(response.BlogEntries[i].Title);
                            }

                        }
                        else {
                          //.....
                        }
                    },                        
                    error: function (xhr, status) {                            
                        //......
                    }
                });

AT CONTROLLER

public JsonResult GetBlogEntries(MarkerOfPlace placeMarker)
    {
        try
        {
            List<BlogEntry> blogEntries = _blogEntryRepo.GetAll(x => x.IsActive.Value && x.PlaceMarkerID == placeMarker.Id).ToList();                

            return Json(new { Success = true, BlogEntries = blogEntries});
        }
        catch (Exception ex)
        {
            return Json(new { Success = false, Message = ex.Message });
        }
    }

2 个答案:

答案 0 :(得分:0)

JavaScript无法直接调用服务器端方法;你需要使用Ajax。

解决问题的最简单方法是使用SeoUrl返回匿名类型以及BlogEntry的其他属性。

public JsonResult GetBlogEntries(MarkerOfPlace placeMarker)
{
    try
    {
        var blogEntries = _blogEntryRepo
            .GetAll(x => x.IsActive.Value && x.PlaceMarkerID == placeMarker.Id)
            .Select(x => new
            {
                ... Map BlogEntry's other properties here
                Title = x.Title,
                SeoUrl = MVCHelper.RouteHelper.MakeSeoUrl(x.Title)
            })
            .ToList();

        return Json(new { Success = true, BlogEntries = blogEntries });
    }
    catch (Exception ex)
    {
        return Json(new { Success = false, Message = ex.Message });
    }
}

答案 1 :(得分:0)

您不能在javascript(客户端)中使用服务器端方法。

您应该做的是使用viewmodel并从API操作结果返回已格式化的响应:

public class BlogEntryViewModel 
{
    // any other properties you need
    public string TitleUrl { get; set; }
}

public JsonResult GetBlogEntries(MarkerOfPlace placeMarker)
{
    try
    {
        var blogEntries = _blogEntryRepo.GetAll(x => x.IsActive.Value && x.PlaceMarkerID == placeMarker.Id)
        .Select(e => new BlogEntryViewModel {
            TitleUrl = MVCHelper.RouteHelper.MakeSeoUrl(e.Title),
            // other properties here
        })
        .ToList();                

        return Json(new { Success = true, BlogEntries = blogEntries});
    }
    catch (Exception ex)
    {
        return Json(new { Success = false, Message = ex.Message });
    }
}