我正在使用[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#方法。
答案 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() } );
}