我有两个控制器(controllerA.actionA& controllerB.actionB),它们共享相同的视图和视图模型(ViewModel_Shared)。
因此,在两个Controller中,我使用RedirectToAction重定向到指向共享视图的第三个控制器(controllerC.actionC)。 所有三个动作都在不同的Controller中。 调用ActionA或ActionB时从视图发布的所有参数都已成功发送到actionC中的modelC。
但是,当我尝试将数据提供给对象(Item)时,抛出了NullReference异常。对象(Item)为NULL。
但我确定在调用ActionA并调用ActionC时,ViewModel_Shared的构造函数被命中为TWICE。
所以,基本上,对象(Item)是NEW两次。
我真的不明白为什么会这样。 谢谢大家!!!
public ActionResult actionA (ViewModel_Shared modelA)
{
return RedirectToAction("actionC", "controllerC", modelA);
}
public ActionResult actionB (ViewModel_Shared modelB)
{
return RedirectToAction("actionC", "controllerC", modelB);
}
public ActionResult actionC (ViewModel_Shared modelC)
{
modelC.FillEditedData();
// Send the data to view
ViewData.Model = modelC;
return View();
}
public class ViewModel_Shared
{
public ItemCustomer Item { get; set; }
public ViewModel_Shared()
{
Item = new ItemCustomer();
}
public void FillEditedData()
{
// NullReference exception was throw here, somehow, Item is null.
Item.LegalCost = "some value";
}
}
[Serializable]
public class ItemCustomer
{
public string Item_No { get; set; }
public string MaterialPricingGroup { get; set; }
public string MaterialGroup { get; set; }
public string Plant { get; set; }
public string LegalCost { get; set; }
}
答案 0 :(得分:0)
如上所述,复杂对象无法随请求一起旅行。
相反,您需要序列化对象并将序列化数据传递给目标操作方法:
public ActionResult actionA (ViewModel_Shared modelA)
{
var serializedModel = JsonConvert.SerializeObject(modelA);
return RedirectToAction("actionC", "controllerC", serializedModel);
}
我的坏。实际上,通过RedirectToAction()
发送的参数将作为路由值发送,因此即使序列化也无法帮助。至少不是自己 - 必须正确设置路由...
必须采取不同的方法,在actionA
期间,将modelA
放入TempData
,然后重定向。在actionC
中检索模型并继续。
public ActionResult actionA (ViewModel_Shared modelA)
{
TempData["shared_model"] = modelA;
return RedirectToAction("actionC", "controllerC");
}
稍后,在actionC
:
public ActionResult actionC (ViewModel_Shared modelA)
{
var modelC = TempData["shared_model"];
modelC.FillEditedData();
ViewBag.Model = modelC;
return View();
}
请注意,TempData
中的对象仅对下一个请求有效,然后消失。您可以在此处详细了解TempData
。
答案 1 :(得分:0)
阴
1)如果您使用 ItemCustomer 类作为属性,则应在使用时对其进行初始化。
UILabel
2)如果您使用 ItemCustomer 作为对象,则在构造函数调用时将初始化。
public ItemCustomer Item { get; set; }
我没有得到第二个点并设置它正常工作。