2010-11-21 104 views
1

不确定这是否曾被问过,但我有一个对象(餐厅),我有该餐厅的详细信息视图。在那个细节上,我想要一份餐厅提供的美食列表。我还想要一个可用菜单的下拉列表,并且可以点击“添加”按钮,并将其添加到餐厅。我有一个RestaurantCuisine表格(使用实体框架),该表格有一个美食ID的外键,这个美食表格有一个ID主关键字。MVC2将对象集合添加到另一个对象

所以,现在,我的问题,我该怎么做?我排序了解创建视图背后的概念,然后创建视图后,但在这种情况下,我不回发餐厅对象。那么,如何获得餐厅ID和美食ID,以便将其添加到餐馆美食收藏中?

好吧,所以,现在经过调查更多,我相信我提出了错误的问题。我的实际问题是,我有一个显示餐厅细节的视图,我的控制器中有一个Details功能。这工作正常。我想要做的下一步是在这个餐厅提供的可用美食下拉列表中,并在其旁边有一个“添加”按钮。如果您点击“添加”按钮,它会将下拉列表中的项目值添加到Restaurant对象中设置的美食集合中。

这是“容易”可能吗?我开始失去了我对MVC2的信心:(

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

回答

0

对于那些试图使用VB.Net和MVC的人,我正在为你祷告,这很粗糙,很少有例子,有些语法是不可用的在C#中可用。所以,就我原来的问题的答案。似乎是我的经验不足,导致了问题的即时耀斑。解决它的方法。首先,乐我要澄清我正在尝试做什么,然后解释我做了什么。目标是有一个对象(餐厅在我的情况)。我想要在Details视图中显示我可以分配给该对象(餐厅)的属性(在我的情况下为美食)列表。这些属性是我在美食表(CuisineId,Name,Description)中设置的美食,当您向餐厅添加美食时,它会在另一个餐厅RestaurantCuisine(RestaurantCuisineId,RestaurantId,CuisineId)中创建一条记录。因此,获得菜单清单是第一项任务,并将其显示在下拉列表中。通过创建一个CuisineRepository并调用得到所有美食列表的功能,这是通过建立在详细的菜肴的选择列表进行浏览功能:

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

一旦你有了这个设置为的SelectList,很容易显示那在视图上做的如下:

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

所以,之后的问题才是真正的问题。我想要一个绑定到DropDownList值的ActionLink。我在这次尝试中没有成功。但幸运的是,我的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视图所需的对象(Restaurant)的id,并且无法在任何地方找到语法。最后,经过一段时间的搜索,发现这个网站有一些控制器的例子,幸运的是他给出了C#和VB的例子。要routeValues添加到RedirectToAction,你声明一个新的列表,并使用与内联和带期间之前将它们添加你的价值观(。):

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

我希望这可以帮助别人。它肯定会影响我使用MVC的决定。尽管我知道我会一路遇到很多障碍,但我仍然100%出售。

+0

你是个勇敢的人。 – rboarman 2010-11-22 23:25:18

相关问题