MVC2 добавляет коллекцию объекта к другому объекту - PullRequest
1 голос
/ 21 ноября 2010

Не уверен, если это было задано ранее, но у меня есть объект (Ресторан), и у меня есть подробный вид этого ресторана.В этом подробном представлении я хочу иметь список кухонь, которые предлагает ресторан.Я также хочу иметь выпадающий список доступных кухонь и иметь возможность нажать кнопку «Добавить», и это добавит эту кухню в Ресторан.У меня есть таблица RestaurantCuisine (использующая Entity Framework), в которой есть внешний ключ идентификатора кухни из таблицы Kitchen, у которого есть первичный ключ ID.

Итак, теперь мой вопрос, как мне это сделать?Я понимаю концепцию создания представления, а затем публикацию представления создания, но в этом случае я не публикую обратно объект Restaurant.Итак, как мне получить идентификационный номер ресторана и идентификационный номер кухни, чтобы я мог добавить их в коллекцию ресторанной кухни?

Хорошо, теперь, после более подробного изучения, я считаю, что я задал неправильныйвопрос.Моя настоящая проблема заключается в том, что у меня есть View, который отображает детали ресторана, и у меня есть функция Details для этого в моем контроллере.Это отлично работает.Следующий шаг, который я хочу сделать, - это выпадающий список доступных кухонь, предлагаемых этим рестораном, и кнопка «Добавить» рядом с ним.И если вы нажмете кнопку «Добавить», это добавит значение элемента из выпадающего списка к коллекции кухонь, установленной в объекте «Ресторан».

Возможно ли это "легко"?Я начинаю терять веру в MVC2: (

Хорошо, последняя попытка здесь. Позвольте мне спросить это, кто-нибудь знает, как иметь выпадающий список (у меня теперь это создано) и "Добавитьрядом с ним и получить выбранное значение из выпадающего списка?

1 Ответ

0 голосов
/ 22 ноября 2010

Для тех из вас, кто пытается использовать VB.Net с MVC, я молюсь за вас.Это грубоЕсть редко какие-либо примеры, и некоторые синтаксис недоступен, который доступен в C #.Итак, что касается ответа на мой оригинальный вопрос.Кажется, что именно моя неопытность вызвала мгновенную вспышку вопроса.

После анализа моей проблемы, я нашел способ ее обойти.Прежде всего, позвольте мне уточнить, что я пытался сделать, а затем объяснить, что я сделал.Цель состояла в том, чтобы иметь объект (Ресторан в моем случае).И я хотел, чтобы список свойств (кухни в моем случае) отображался в представлении «Детали», которое я мог бы назначить этому объекту (Ресторан).Свойствами были кухни, которые я настроил в таблице кухонь (CuisineId, Name, Description), и когда вы добавляете кухню в ресторан, она записывает запись в другой таблице RestaurantCuisine (RestaurantCuisineId, RestaurantId, CuisineId).Таким образом, получение списка кухонь было первой задачей и показало их в выпадающем списке.Это было сделано путем создания списка SelectList кухонь в функции представления Details, создав хранилище 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>

Итак, как вы можете видеть, я просто изменяю ссылку якоря, когда пользователь меняет выбранную кухню.,Затем в моем контроллере у меня есть функция настройки для добавления кухни и удаления кухни из ресторана:

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.Мне пришлось передать идентификатор объекта (Restaurant), который требовался для представления Details, и нигде не смог найти синтаксис.Наконец, спустя некоторое время поиска, нашел этот сайт, на котором у парня есть несколько примеров контроллеров и, к счастью, он приводит примеры как C #, так и VB.Чтобы добавить routeValues ​​в RedirectToAction, вы объявляете новый список и используете встроенную строку и добавляете свои значения с точкой (.) Перед ними:

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

Надеюсь, это кому-нибудь поможет.Это определенно повлияло на мое решение использовать MVC.Я продан на 100%, хотя знаю, что по пути я столкнусь с множеством контрольно-пропускных пунктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...