我知道在SOF中有很多类似的问题,但是我已经查看了所有解决方案并尝试了它们,但是无法使它工作。
问题在于:我有一个控制器方法,它将Viewmodel传递给视图(强类型)。在View中,我在Webgrid中有一个文本框,这样每当它的值发生变化时,它就会回发到另一个控制器方法。问题是我无法在第二个控制器方法中检索我之前传递的Viewmodel数据。
以下是代码:
public ActionResult Index()
{
PlanViewModel myPlan = new PlanViewModel();
/*Do some stuff to populate myPlan object*/
return View("PlanIndex", myPlan);
}
@{
ViewBag.Title = "PlanIndex";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using myproject.ViewModels
@model myproject.ViewModels.PlanViewModel
@using (Html.BeginForm("UpdateUnits", "Plan", FormMethod.Post))
{
var grid = new WebGrid(Model.snack, canSort: false, canPage: false);
int rowNum = 0;
<div>
@grid.GetHtml(columns:
grid.Columns
(
grid.Column("Sr", format: item => rowNum = rowNum + 1),
grid.Column("Unit", format: item => Html.TextBox("FoodList[" + (rowNum - 1).ToString() + "].Unit", (object)item.unit, new { onchange = "submit();" })),
grid.Column("Name", format: (item) => Html.TextBox("FoodList[" + (rowNum - 1).ToString() + "].Name", (object)item.name)),
grid.Column("Serving", format: (item) => Html.TextBox("FoodList[" + (rowNum - 1).ToString() + "].Serving", (object)item.serving)),
grid.Column("Serving Unit", format: (item) => Html.TextBox("FoodList[" + (rowNum - 1).ToString() + "].ServingUnit", (object)item.servingUnit)),
grid.Column("Protein", format: (item) => Html.TextBox("FoodList[" + (rowNum - 1).ToString() + "].Protein", (object)item.protein))
), mode: WebGridPagerModes.Numeric)
</div>
}
请注意,在上面的视图中,有一个“Unit”文本框,它在值更改时附加了回发。如果值更改,则调用UpdateUnits操作方法。
[HttpPost]
public ActionResult UpdateUnits(PlanViewModel model)
{
int updatedUnit = model.unit;
/*Some additional complex logic*/
return View("PlanIndex", model);
}
在第二个控制器方法中,模型始终为null。每次用户更改文本框中的值时,我都不想一次又一次地重新填充完整模型。请注意,我的Viewmodel包含多个自定义类列表和其他int,float声明。
我觉得我遗失了一些基本的东西,但是对MVC不熟悉,我无法弄明白。
public class PlanViewModel
{
public List<Food> breakfast { get; set; }
public List<Food> lunch { get; set; }
public List<Food> snack { get; set; }
public List<Food> dinner { get; set; }
public Goal goal { get; set; }
public int totalProtein { get; set; }
}