.NET MVC Null Object,使用RedirectToAction在ViewModel的构造函数中初始化

时间:2017-08-25 03:17:46

标签: c# asp.net-mvc

我有两个控制器(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; }
}

2 个答案:

答案 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; }

我没有得到第二个点并设置它正常工作。