Question

   [HttpGet]
    public JsonResult EfficientPaging(int? page = null, string searchParam = null)
    {
        int skip = page.HasValue ? page.Value - 1 : 0;

        _users = db.Users.Select(u => u).ToList();

        var data = _users.Skip(skip * 10).Take(10).ToList();
        var empty = _users.Any();
        var count = Convert.ToInt32(Math.Ceiling(_users.Count() / 10.0));

        if (!string.IsNullOrEmpty(searchParam))
        {
            empty = !_users.Any(u => u.last_name.ToLower().Contains(searchParam.ToLower()));
            count = _users.Count(u => u.last_name.ToLower().Contains(searchParam.ToLower()));
            data =
                _users.Where(u => u.last_name.ToLower().Contains(searchParam.ToLower()))
                  .Skip(skip * 10)
                  .Take(10)
                  .ToList();
        }


        var grid = new WebGrid(data);
        var htmlString = grid.GetHtml(tableStyle: "webGrid",
                                      headerStyle: "header",
                                      alternatingRowStyle: "alt",
                                      htmlAttributes: new {id = "DataTable"},
                                      columns: grid.Columns(
                                          grid.Column("first_name", "First"),
                                          grid.Column("last_name", "Last"),
                                          grid.Column("username", "Username"),
                                          grid.Column("password_expiration", "Expired"),
                                          grid.Column("locked", "Locked"),
                                          grid.Column(format: (item) => Html.Actionlink("Edit", "Edit", "User", new { userId = item.id }, null))));




        return Json(new
        {
            Data = htmlString.ToHtmlString(),
            Count = count,
            Empty = empty
        }, JsonRequestBehavior.AllowGet);
    }

JQuery:

$(document).ready(function () {
    $('input').keyup(function () {
        var name = $(this).attr("name");
        var searchParameter = $(this).val();
        var element = $(this);
        $.ajax({
            type: "GET",
            url: "User/EfficientPaging",
            data: { searchParam: searchParameter },
            dataType: "json",
            success: function (d) {
                element.parent().parent().find(".file").empty();
                if (d.Empty) {
                    element.parent().parent().find(".file").append("<span style='color: black' >No files in this folder.</span>");
                    element.parent().parent().find(".pagination").empty();
                    element.parent().parent().find(".pagination").hide();
                } else {
                    // add the dynamic WebGrid to the body
                    element.parent().parent().find(".file").append(d.Data);
                    element.parent().parent().find(".pagination").empty();
                    element.parent().parent().find(".pagination").show();
                    element.parent().parent().find(".pagination").append(paging(1, d.Count, 5));
                    pagingEvent();
                }
            }
        });
        //$("#uploadFile").show();
        //$("#uploadButton").show();
        return false;
    });
});

I'm trying to create an asynchronous search box, and it's working great with the exception of the edit link. Html.Actionlink throws the error, "The name 'Html' does not exist in the current context."

VS suggests adding using System.Web.Mvc.Html but System.Web.Mvc.Html.ActionLink doesn't exists.

Was it helpful?

Solution 2

I had to add the ActionLink in the following format:

grid.Column(format: (item) => new HtmlString(string.Format("<a href='{0}'>{1}</a>", Url.Action("Edit", "User", new {userId = item.id}), "Edit"))
                                              )));

OTHER TIPS

You really shouldn't create html in the controller.

With that being said try

grid.Column(format: (item) => 
string.Format("<a href='{0}'>{1}</a>", Url.Action("Edit", "User", new { userId = item.id }), "Edit")
)))

Which is the same as

grid.Column(format: (item) => 
{
var link = Url.Action("Edit", "User", new { userId = item.id });
 return   string.Format("<a href='{0}'>{1}</a>", link, "Edit")

})))

which is also the same as

grid.Column(format: (item) => GetLink(item.Id))))

/* later */

private string GetLink(int id){
     return string.Format("<a href='{0}'>{1}</a>", Url.Action("Edit", "User", new { userId = id }), "Edit");
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top