将控制器方法中的一个项目传递给同一控制器中的另一个方法

时间:2013-10-01 07:48:25

标签: asp.net asp.net-mvc-4

我正在使用[HttpPost]将DateTime值从视图传递回Controller。我在控制器中有另一种方法,我想要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;

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

    [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#方法。

5 个答案:

答案 0 :(得分:2)

取决于你想要做什么。

重定向

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

转移

如果您想模拟重定向但没有往返,则必须编写一些自定义代码。请参阅this article了解具体方法。

返回不同的视图

如果您打算从GetSigmaDateInfo操作返回索引视图,您只需按照以下步骤更改return语句:

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

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

代码重用

如果这里有更多内容(你的帖子中并不完全清楚),一种经过验证的技术就是重构你的代码,这样你就可以用两种方法代替两种方法。我会解释一下。

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

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

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

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方法,则更改向最终用户公开的调用类型。

答案 1 :(得分: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中发送信息。

答案 2 :(得分:0)

只需将此数据放入 ViewBag ViewData ,然后在视图中使用它并完成:

控制器:

[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();
}

查看:

@if(ViewBag.SigmaData != null)
{
  //Show the value somewhere in the view
}

答案 3 :(得分:0)

调用索引视图传递TempData [&#34; SigmaData&#34;] = SigmaData;

return View("Index");

在视图中检查SigmaData是否为空

@if(TempData["SigmaData"] != null)
{
  //your POST method code
}
else
{
  //your GET method code
}

答案 4 :(得分: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() } );
}