将多个模型传递给控制器​​以构建ViewModel

时间:2015-05-12 13:51:06

标签: c# asp.net asp.net-mvc

所以我正在使用RESTFul API来获取我需要的数据。此API返回json,我将其转换为C#模型。 API返回有关供应商和包含产品的阵列的一般信息。产品系列还包括用于定价信息和产品可用性等的阵列......

我面临的问题是,当用户选择购买产品时,我必须从不同阵列中收集特定信息。目前,我已经为需要发送以处理订单的数据创建了一个ViewModel。这是通过使用隐藏字段绑定实际数据并使用视图中的HttpPost来完成的,从而产生+/- 30个隐藏字段来设置正确的数据值。

我对MVC有点新鲜,这看起来很脏。我以为我能够将视图(使用POST)中的模型(例如VendorModel,ProductModel,PricingModel,AvailabilityModel)传递给控制器​​并创建ViewModel(基于模型发送),以便我可以发送到API。

这实际上是应该如何完成的,还是我的设计有问题?我应该采用不同的方法吗?

附注:我发现的一件事是,大多数人建议使用标识符来获取您需要的数据,但问题是API没有正确的调用来获取产品,定价,基于Id的可用性数据,它只是一个基于搜索查询的数组的大对象。

修改

所以在一些信息后我决定试用嵌套模型并创建一个这样的视图模型:

public class TestViewModel
{
    public TestViewModel()
    {
        productInfo = new ProductInfo();
    }

    public ProductInfo productInfo { get; set; }   
}

我的观点是这样的(超级简单):

@using (Html.BeginForm("CreateOrder","Products"))
{
    //Vender info etc...

    //This is how i render partial view now:
    {Html.RenderPartial("Info/ProductInfo", Product.ProductInformation.ProductInfo);} 

    <input type="submit" value="Order" class="btn btn-default" />
}

我的控制器(TestViewModel.ProductInfo始终为null):

public ActionResult MakeReservation(TestViewModel testViewModel)
{
    //Doesnt do anything just debugging TestViewModel
    return View();
}

我没有发布任何输入,只是想将带有数据的模态传递给控制器​​。 MVC将如何知道要绑定哪些数据,因为它现在没有绑定。我必须以某种方式自己绑定它吗?

2 个答案:

答案 0 :(得分:0)

我有类似的情况,我有一个建议,您可以将所有模型传递给视图,因为使用我在下面使用的示例代码保存在javascript对象中作为JSON -

<script type="text/javascript">
    var pageBlockOptionsJSON = @(Html.Raw(Json.Encode(DesignOrderBlocks)));
    var controlTypeJSON = @(Html.Raw(Json.Encode(controlList)));
</script>

然后你可以使用jQuery进行所有操作来构造和创建一个javascript对象并将该对象发布到Controller Action。您可以创建服务器上所需的相同或精确结构。正如此网址中指定的那样 - http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

通过这种方式,您不需要使用大量隐藏字段,并且可以使用jQuery在客户端执行所有脏工作。

我相信这会帮助你以正确的方式做事。如果您需要一些细节,请告诉我。

答案 1 :(得分:0)

对于那些以某种方式找到这些问题的人,我通过使用实体框架将模型作为搜索结果保存到数据库来解决了这个问题。获得结果后,我保存并创建一个viewmodel。发布后,发送id生成的实体框架,并在数据库中搜索正确的模型,创建一个新的postview模型。