2010-11-21 100 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

相關問題