如何将JsonResult数据传递给控制器ActionResult并提取它?

How to Pass JsonResult Data to Controller ActionResult and Extract it?

提问人: 提问时间:5/21/2022 更新时间:6/24/2022 访问量:172

问:

在我的“详细信息”视图中,我有一个“上一个”和一个“下一个”按钮,用于在记录之间导航。以下代码位于我的 Details 方法中:

ViewBag.PreviousId = _db.Applications.OrderByDescending(a => a.AppNumber).Where(a => a.AppNumber < application.AppNumber).Select(a => a.Id).FirstOrDefault();

ViewBag.NextId = _db.Applications.OrderBy(a => a.AppNumber).Where(a => a.AppNumber > application.AppNumber).Select(a => a.Id).FirstOrDefault();

我不需要在所有记录之间导航,而只需要在jQuery数据表结果中显示的记录之间导航。

例如,数据库中可能存在记录 1、2、3、4 和 5。但是,在搜索/过滤我的数据表后,结果可能只是记录 1、3 和 5。因此,如果我打开记录 3 的“详细信息”视图,单击“上一个”按钮应该会带我到记录 1,单击“下一个”按钮应该会带我到记录 5。

在我的 Index 视图中,我有一个 jQuery 数据表。以下是我的 JsonResult 方法的一部分,用于执行搜索、排序和分页:

public JsonResult GetApplications()
{
    var draw = Request.Form.GetValues("draw")[0];
    var order = Request.Form.GetValues("order[0][column]")[0];
    var orderDir = Request.Form.GetValues("order[0][dir]")[0];
    var start = Convert.ToInt32(Request.Form.GetValues("start")[0]);
    var length = Convert.ToInt32(Request.Form.GetValues("length")[0]);
    var data = _db.Applications.AsQueryable();
    var totalRecords = data.Count();

    --code--

    var filteredRecords = data.Count();

    data = data.Skip(start).Take(length);

    var modifiedData = data.Select(a =>
        new
        {
            a.AppNumber,
            --code--  
            a.Id
        });

    return Json(new
    {
        draw = Convert.ToInt32(draw),
        recordsTotal = totalRecords,
        recordsFiltered = filteredRecords,
        data = modifiedData
    }, JsonRequestBehavior.AllowGet);
}

如何将 JsonResult 数据传递给我的 Details 方法并提取 AppNumber 和 Id 值?

伪代码:

ViewBag.PreviousId = GetApplications().OrderByDescending(a => a.AppNumber).Where(a => a.AppNumber < application.AppNumber).Select(a => a.Id).FirstOrDefault();

ViewBag.NextId = GetApplications().OrderBy(a => a.AppNumber).Where(a => a.AppNumber > application.AppNumber).Select(a => a.Id).FirstOrDefault();
C# ASP.NET-MVC JSONRESULT

评论

0赞 Roe 5/21/2022
Details 方法是 C# 方法吗?如果是这种情况,则不能使用 json,则只需在 C# 方法之间传递对象即可。
0赞 Roe 5/21/2022
您还应该避免通过 c# 进行分页。Jquery 有一些很棒的库,比如 Datatables.net,它们将拥有您需要的所有功能。
0赞 5/21/2022
Details 方法是 C# 方法。
0赞 Roe 5/21/2022
您能否说明细节在哪里调用GetApplications()
0赞 5/21/2022
我通过 C# 进行分页,因为我使用的是服务器端数据表。启用 serverSide 选项后,数据表库将不再为您执行分页。

答:

0赞 Roe 5/21/2022 #1

回答您的问题。我不建议在 C# 方法中使用 Json,它对于发送回前端而不是后端非常有用,因为它不像 C# 那样静态类型化。

您应该创建一个单独的函数,该函数负责使用自定义返回类型从 Applications 表中获取数据。创建一个类,将所有属性添加到该类中,瞧,您现在可以将该类用于应用程序内的所有交互。Application

看起来像这样。

public class Application
{
    public int Draw {get; set;}
    public int RecordCount {get; set;}
    public RecordsFiltered {get; set;}
}

为了使用这个类,你可以简单地在一个方法中这样做:

var application = new Application()
{
    Draw = draw,
    RecordCount = recordCount,
    //etc
}

若要使用该类的此实例中的数据,可以执行以下操作:

application.Draw //to get one specific property from the class

application //to get the whole object

可以将这个新类用作数据库 get 方法中的返回类型:Application

public List<Application> GetApplications()
{
    var applications = new List<Application>();
    // get all data and fill application object

    return applications
}
0赞 user17824052 6/24/2022 #2

我的解决方案是在以下方法中保存到会话:data.ToList()JsonResult

Session["HR_Applications"] = data.ToList();.

然后从方法中的会话中获取值:Details

var applications = (List<Application>)Session["HR_Applications"];

最后,设置 previousId 和 nextId 值:

ViewBag.PreviousId = applications.OrderByDescending(a => a.AppNumber).Where(a => a.AppNumber < application.AppNumber).Select(a => a.ApplicationId).FirstOrDefault();

ViewBag.NextId = applications.OrderBy(a => a.AppNumber).Where(a => a.AppNumber > application.AppNumber).Select(a => a.ApplicationId).FirstOrDefault();