1

我将 DateTime 值从使用的视图传递回[HttpPost]控制器。我在控制器中有另一种方法,我也想要 HttpPost 方法的结果。或者我可以将 HttpPost 传递回视图。

我想要的是从 HttpPost 方法的表单中显示 LINQ 的值。

我使用的填充视图的原始方法如下。

  public ActionResult Index()
    {


        ViewBag.Message = "Real Time Production";

        DateTime ShiftStart = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
        DateTime StartShift = ShiftStart.AddHours(7);
        DateTime EndDate = StartShift.AddDays(1);
        try
        {
            var PumaProduct =
            new
        {
            PumaCastGood =
                (from item in db.tbl_dppITHr
                 where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
                 select item).Sum(x => x.PumaCastGross) ?? 0,

            PumaScrap =
                (from item in db.tbl_dppITHr
                 where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
                 select item).Sum(x => x.PumaScrap) ?? 0,

            PumaMachined =
            (
            from item in db.tbl_dppITHr
            where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
            select item).Sum(x => x.PumaMachined) ?? 0,

            PumaHeatTreat =
            (
            from item in db.tbl_dppITHr
            where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
            select item).Sum(x => x.ATIPuma) ?? 0,

            PumaShipped =
              (
            from item in db.tbl_dppITHr
            where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate
            select item).Sum(x => x.PumaShipped) ?? 0,
        };
            ViewData["PumaCastGood"] = PumaProduct.PumaCastGood;
            ViewData["PumaCastScrap"] = PumaProduct.PumaScrap;
            ViewData["PumaMachined"] = PumaProduct.PumaMachined;
            ViewData["PumaShipped"] = PumaProduct.PumaShipped;
            ViewData["PumaHeatTreat"] = PumaProduct.PumaHeatTreat;

以下是我想传递给 ActionResult 索引或与 Index 方法中的项目一起传递给视图的 HttpPost 方法。

    [HttpPost]
    public ActionResult GetSigmaDateInfo(string dp)
    {
        DateTime SelectedDate = Convert.ToDateTime(dp);
        DateTime SelectedDateDayShiftStart = SelectedDate.AddHours(7);
        DateTime SelectedDateDayShiftEnd = SelectedDate.AddHours(19);

        var SigmaData =

            from n in db.tbl_dppITHr
            where n.ProductionHour >= SelectedDateDayShiftStart
            where n.ProductionHour <= SelectedDateDayShiftEnd
            select n;


        return View();

    }

我已经尝试过在方法之间传递方法值的普通 C# 方法。

4

5 回答 5

2

取决于你想要做什么。

重定向

如果您的意图是在动作之间重定向,请使用上面的 Moho 答案。这自然会导致浏览器往返。在此往返过程中,您的 ViewBag 将丢失,但您始终可以使用 TempData。

转移

如果您想模拟重定向但没有往返,您将不得不编写一点点自定义代码。请参阅这篇文章以了解如何操作。

返回不同的视图

如果您的意图是从 GetSigmaDateInfo 操作返回索引视图,您所要做的就是更改最后的 return 语句,如下所示:

return View("Index");  //Or substitute the name of the desired view

这避免了浏览器的第二次往返,并保留了您的 ViewBag。Index 视图可以检查 GetSigmaDateInfo 设置的任何 ViewBag 值,因此无需直接传递数据。

代码重用

如果这里还有更多内容(从您的帖子中并不完全清楚),一种经过验证的技术是重构您的代码,以便您拥有三种方法而不是两种方法。我会解释的。

目前您有两个动作,并且您将问题视为一个动作调用另一个动作。相反,我建议您将其视为两个不必相互调用但具有共同逻辑的操作。

当你有两个具有共同逻辑的函数时,你会怎么做?您重构:删除通用逻辑,将其放在第三个函数中,并修改两个原始函数以调用该新函数,而不是将逻辑放在两个地方。

在这种情况下,第三个函数可以是一个新的控制器方法(它必须标记为私有,这样它就不能作为一个动作调用),或者您可以考虑编写一个包含新函数的私有帮助器类。两者都很好。我在下面的示例中使用了后一个选项。

public ActionResult Index()
{
    //Perform action-specific validation and logic here
    var result = DBHelper.GetSigmaData();  //Not sure what your intention is here
    ViewBag.SigmaData = result;
    //Do something with the result here
    return View();
}

[HttpPost]
public ActionResult GetSigmaDateInfo(string dp)
{
    //Perform action-specific validation and logic here
    var result = DBHelper.GetSigmaData(dp);
    ViewBag.SigmaData = result;
    //Do something with the result here
    return View();
}

最后是你的共同逻辑

static internal class DBHelper
{
    static public DateTime GetSigmaData(string dp = null)
    {
        DateTime SelectedDate = Convert.ToDateTime(dp);
        DateTime SelectedDateDayShiftStart = SelectedDate.AddHours(7);
        DateTime SelectedDateDayShiftEnd = SelectedDate.AddHours(19);

        var SigmaData =
            from n in db.tbl_dppITHr
            where n.ProductionHour >= SelectedDateDayShiftStart
            where n.ProductionHour <= SelectedDateDayShiftEnd
            select n;

        return SigmaData;
    }
}

使用这种方法可以避免修改 Index 方法以接受可选参数。你可能不想这样做。如果您更改 Index 方法,则会更改您向最终用户公开的调用类型。

于 2013-10-07T17:34:37.857 回答
1

您是否尝试将 GetSigmaDateInfo 中计算的 SigmaData 值传递给 Index 方法?如果那是您要尝试做的事情,那么沿着这些思路应该可以工作。

public ActionResult Index(SigmaData SigmaData = null)
{
    if(SigmaData == null){
        //Handle the case where the call is coming straight from routing engine
    }else{
        //Handle the case where the call is coming from GetSigmaDateInfo()
    }
    //Code common to both cases
    return view("GetSigmaDateInfo");
}

[HttpPost]
public ActionResult GetSigmaDateInfo(string dp)
{
    DateTime SelectedDate = Convert.ToDateTime(dp);
    DateTime SelectedDateDayShiftStart = SelectedDate.AddHours(7);
    DateTime SelectedDateDayShiftEnd = SelectedDate.AddHours(19);

    var SigmaData =
        from n in db.tbl_dppITHr
        where n.ProductionHour >= SelectedDateDayShiftStart
        where n.ProductionHour <= SelectedDateDayShiftEnd
        select n;
    return Index(SigmaData);

}

如果我有什么问题,请在评论中告诉我,我会尝试从那里修复代码。在相关说明中,我敦促您考虑使用强类型视图,而不是在 ViewBag 或 ViewData 中发送信息。

于 2013-10-04T12:22:59.507 回答
0

Just put this data into ViewBag or ViewData, and use it in the view and done:

Controller:

[HttpPost]
public ActionResult GetSigmaDateInfo(string dp)
{
    DateTime SelectedDate = Convert.ToDateTime(dp);
    DateTime SelectedDateDayShiftStart = SelectedDate.AddHours(7);
    DateTime SelectedDateDayShiftEnd = SelectedDate.AddHours(19);

    var SigmaData =
        from n in db.tbl_dppITHr
        where n.ProductionHour >= SelectedDateDayShiftStart
        where n.ProductionHour <= SelectedDateDayShiftEnd
        select n;

    ViewBag.SigmaData = SigmaData;


    return View();
}

View:

@if(ViewBag.SigmaData != null)
{
  //Show the value somewhere in the view
}
于 2013-10-04T11:04:27.957 回答
0

Index()一个可选参数

public ActionResult Index( IEnumerable<tbl_dppITHr> p = null )
{
    // existing code

    if( null != p )
    {
        // new code to hand the case then you pass the parm from GetSigmaDateInfo(...)
    }

    // maybe more existing code
}

然后更改GetSigmaDateInfo以返回带有参数的 RedirectToAction 结果

[HttpPost]
public ActionResult GetSigmaDateInfo(string dp)
{
    DateTime SelectedDate = Convert.ToDateTime(dp);
    DateTime SelectedDateDayShiftStart = SelectedDate.AddHours(7);
    DateTime SelectedDateDayShiftEnd = SelectedDate.AddHours(19);

    var SigmaData =
        from n in db.tbl_dppITHr
        where n.ProductionHour >= SelectedDateDayShiftStart
        where n.ProductionHour <= SelectedDateDayShiftEnd
        select n;

    return RedirectToAction( "Index", new { p = SigmaData.ToList() } );
}
于 2013-10-05T04:54:48.987 回答
0

调用索引视图传递 TempData["SigmaData"] = SigmaData;

return View("Index");

在视图中检查是否SigmaData 为空

@if(TempData["SigmaData"] != null)
{
  //your POST method code
}
else
{
  //your GET method code
}
于 2013-10-04T11:35:24.277 回答