MVC2将对象集合添加到另一个对象

时间:2010-11-21 15:49:00

标签: asp.net-mvc-2 entity-framework-4

不确定之前是否曾询问过,但我有一个对象(餐厅),我有一个该餐厅的详细信息视图。在详细信息视图中,我想要一份餐厅提供的美食清单。我想要一份可用菜肴的下拉列表,并且能够点击“添加”按钮,它会将这些美食添加到餐厅。我有一个RestaurantCuisine表(使用实体框架),该表具有来自具有ID主键的Cuisine表的菜肴ID的外键。

所以,现在,我的问题,我该怎么做?我理解创建视图背后的概念,然后是创建视图帖子,但在这种情况下,我不会回发餐厅对象。那么,我如何获得餐厅ID和美食ID,以便我可以将其添加到餐厅美食系列中?

好的,所以,现在在调查更多之后,我相信我提出了错误的问题。我的实际问题是,我有一个显示餐厅详细信息的视图,我的控制器中有一个详细信息功能。这很好用。我想要做的下一步是有一个下拉列表,其中包含该餐厅提供的美食,旁边有一个“添加”按钮。如果单击“添加”按钮,它会将下拉列表中项目的值添加到Restaurant对象中设置的菜系集合中。

这“容易”吗?我开始对MVC2失去信心:(

好的,最后一次尝试。让我问一下,有没有人知道如何有一个下拉列表(我现在已经创建了这个)并且旁边有一个“添加”按钮,并从该下拉列表中获取所选值?

1 个答案:

答案 0 :(得分:0)

对于那些试图将VB.Net与MVC一起使用的人,我正在为你祈祷。这很糟糕。很少有任何示例,并且C#中提供的某些语法不可用。所以,就我原来问题的答案而言。似乎是我的经验不足导致了问题的即时突发。

在分析了我的问题之后,我找到了解决问题的方法。首先,让我澄清一下我的尝试,然后解释我的所作所为。目标是有一个对象(在我的情况下餐厅)。我希望在详细信息视图中显示一个属性列表(在我的例子中为菜肴),我可以将其分配给该对象(餐厅)。这些属性是我在美食桌(CuisineId,名称,描述)中设置的美食,当您在餐厅添加美食时,它会在另一张桌子上写下餐厅RestaurantCuisine(RestaurantCuisineId,RestaurantId,CuisineId)。因此,获取菜肴列表是第一项任务,并将它们显示在下拉列表中。这是通过在详细信息视图功能中创建菜单的SelectList来完成的,方法是创建一个CuisineRepository并调用一个获取所有菜肴列表的函数:

Dim cuiss As New CuisineRepository()
        ViewData("Cuisines") = New SelectList(cuiss.FindAllCuisines().ToList(), "CuisineId", "Name")

将此设置作为SelectList后,可以通过执行以下操作在视图上轻松显示:

<h3>Cuisines:</h3>
<br />
<%= Html.DropDownList("Cuisines")%>  

所以,之后的问题是真正的问题。我想要一个ActionLink,它将绑定到DropDownList的值。我在这次尝试中没有成功。但幸运的是,我的jQuery并没有尘土飞扬,所以我通过以下方式表现出一点魔力:

<script type="text/Javascript">
    $(document).ready(function () {
        $('#Cuisines').change(function (e) {
            $('#SelectedCuisine').val($('#Cuisines').val());
            setHref($(this).val());
        });

        setHref($('#Cuisines').val());
    });

    function setHref(val) {
        if (val) {
            $("#addCuisine").attr('href', '/Restaurant/AddCuisine/' + $('#RestaurantId').val() + '?cuisineId=' + val);
        }
    } 

</script>
<h3>Cuisines:</h3>
<br />
<%= Html.DropDownList("Cuisines")%>  
<a id="addCuisine" href="">Add</a>

因此,正如您所看到的,我只是在用户更改所选菜肴时修改锚点的href。然后,在我的控制器中,我有一个功能设置来添加菜肴并从餐馆中删除菜肴:

Function AddCuisine(ByVal id As Guid, ByVal cuisineId As String) As ActionResult
        Try
            If ModelState.IsValid Then
                'Dim selcuisInp As HtmlInputHidden = ViewData("SelectedCuisine")
                Dim selectedCuisineId As Guid = New Guid(cuisineId)

                Dim rc As New RestaurantCuisine
                rc.RestaurantCuisineId = Guid.NewGuid
                rc.RestaurantId = id
                rc.CuisineId = selectedCuisineId
                'rc.CuisineId = New Guid(selList.SelectedValue.ToString)
                rc.CreatedDate = DateTime.Now()
                'rc.CreatedBy = 
                db.AddToRestaurantCuisines(rc)
                db.SaveChanges()
            End If

            Return RedirectToAction("Details", New With {.id = id})
        Catch e As Exception
            Dim innerE As String = e.InnerException.ToString
            Return RedirectToAction("Details", New With {.id = id})
        End Try
    End Function

    Function DeleteRestaurantCuisine(ByVal id As Guid) As ActionResult
        Dim rc = (From rcs In db.RestaurantCuisines
                   Where rcs.RestaurantCuisineId = id
                   Select rcs).Single()

        Dim rid As Guid = rc.RestaurantId

        Try
            db.RestaurantCuisines.DeleteObject(rc)
            db.SaveChanges()

            Return RedirectToAction("Details", New With {.id = rid})

        Catch ex As Exception
            Return RedirectToAction("Details", New With {.id = rid})
        End Try
    End Function

注意RedirectToAction。我必须传递Details视图所需的对象(餐厅)的id,并且无法在任何地方找到语法。最后,经过一段时间的搜索,发现这个网站上有一些控制器的例子,幸运的是他给出了C#和VB的例子。要将routeValues添加到RedirectToAction,请声明一个新列表,并使用内联并在其前面添加一个句点(。):

Return RedirectToAction("Details", New With {.id = rid})

我希望这有助于某人。这肯定会影响我使用MVC的决定。即使我知道我将要遇到很多路障,我100%已售出。