代码之家  ›  专栏  ›  技术社区  ›  clockwiseq

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

  •  1
  • clockwiseq  · 技术社区  · 14 年前

    我不确定以前有没有人问过这个问题,但我有一个对象(餐馆),我有那个餐馆的详细情况。在这个细节视图中,我想要一个餐厅提供的菜系列表。我还想有一个下拉列表的可用菜系,并有能力点击一个“添加”按钮,它添加到餐厅的菜肴。我有一个restaurantguisine表(使用实体框架),其中有一个菜系ID的外键,而一个菜系表的主键是ID。

    好吧,那么,现在经过更多的调查,我相信我问错了问题。我的实际问题是,我有一个显示餐厅详细信息的视图,并且在控制器中有一个详细信息功能。这很管用。下一步我想做的是有一个下拉列表,里面有这家餐厅提供的菜系,旁边还有一个“添加”按钮。如果单击“添加”按钮,则会将下拉列表中项目的值添加到Restaurant对象中设置的菜系集合中。

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   clockwiseq    14 年前

    对于那些试图将VB.Net与MVC结合使用的人,我为你们祈祷。很粗糙。很少有示例,而且有些语法在C#中不可用。所以,就我最初问题的答案而言。似乎是我的经验不足引起了这个问题的突然爆发。

    在分析了我的问题之后,我想出了一个解决办法。首先,让我澄清一下我想做什么,然后解释一下我做了什么。目标是要有一个对象(在我的情况下是餐厅)。我想在Details视图上显示一个属性列表(在我的例子中是菜系),我可以将其分配给那个对象(餐厅)。这些属性是我在菜谱表中设置的菜谱(菜谱ID、名称、描述),当您向餐厅添加菜谱时,它会在另一个餐厅菜谱(RestaurantCuisineId、RestaurantId、CuisineId)中写入记录。因此,获取菜系列表是第一个任务,并将其显示在下拉列表中。这是通过在Details view函数中创建一个菜系选择列表来完成的,方法是创建一个菜系存储库并调用一个获取所有菜系列表的函数:

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

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

    <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>
    

    所以,如您所见,我只是在用户更改所选美食时修改锚的ref。然后,在我的控制器中,我有一个功能设置,可以添加一种菜肴并从餐厅中移除一种菜肴:

    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
    

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

    我希望这对某人有帮助。这确实改变了我使用MVC的决定。尽管我知道我会遇到很多路障,但我还是100%被卖掉了。