ASP.NET MVC 2 UpdateModel () не обновляет значения в памяти или базе данных

2

Я новичок в MVC, поэтому работаю над учебником NerdDinner здесь. В частности, у меня возникают проблемы с использованием метода UpdateModel, который объясняется в пятой части этого учебника. Проблема в том, что когда я пытаюсь изменить значение объекта ужина с помощью метода UpdateModel, значения не обновляются, и никаких исключений не возникает.

Как ни странно, у меня нет проблем с функциями Create или Delete, которые проиллюстрированы в учебнике. Только функция обновления не работает.

Ниже я включил код контроллера, который я использую, а также разметку представления, которая содержится как в файле aspx View, так и в файле с частичным представлением ascx.

Вот код внутри моего контроллера, называемый DinnerController.cs:

    //
    // GET: /Dinners/Edit/2
    [Authorize]
    public ActionResult Edit(int id)
    {

        Dinner dinner = dinnerRepository.GetDinner(id);

        return View(new DinnerFormViewModel(dinner)); 
    }

    //
    // POST: /Dinners/Edit/2
    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection formValues)
    {

        Dinner dinner = dinnerRepository.GetDinner(id);

        try
        {
            UpdateModel(dinner);
            var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors

            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.DinnerID });
        }
        catch
        {

            ModelState.AddRuleViolations(dinner.GetRuleViolations());

            return View(new DinnerFormViewModel(dinner)); 
        }
    }

строка с комментарием "поймать другие ошибки ModelState" была добавлена ​​после прочтения возможного решения из другого потока StackOverflow:

ASP.NET MVC Updatemodel не обновляет, а не бросает ошибку

К сожалению, это решение мне не помогло.

Вот соответствующая разметка в моем представлении Dinners/Edit.aspx:

<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Edit Dinner</h2>

    <% Html.RenderPartial("DinnerForm"); %>

</asp:Content>

Вот соответствующая разметка в частичном представлении DinnerForm.ascx. Этот файл Partial View также используется функцией Create, которая отлично работает:

<%=Html.ValidationSummary("Please correct the errors and try again.") %>  

<% using (Html.BeginForm()) { %>

    <fieldset>
        <p>
            <label for="Title">Dinner Title:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Title)%>
            <%=Html.ValidationMessage("Title", "*") %>
        </p>
        <p>
            <label for="EventDate">EventDate:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.EventDate, new { value = String.Format("{0:g}", Model.Dinner.EventDate) })%>
            <%=Html.ValidationMessage("EventDate", "*") %>
        </p>
        <p>
            <label for="Description">Description:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Description)%>
            <%=Html.ValidationMessage("Description", "*")%>
        </p>
        <p>
            <label for="Address">Address:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Address)%>
            <%=Html.ValidationMessage("Address", "*") %>
        </p>
        <p>
            <label for="Country">Country:</label>
            <%=Html.DropDownListFor(model => Model.Dinner.Country, Model.Countries)%>
            <%=Html.ValidationMessage("Country", "*") %>
        </p>
        <p>
            <label for="ContactPhone">ContactPhone #:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.ContactPhone)%>
            <%=Html.ValidationMessage("ContactPhone", "*") %>
        </p>
        <p>
            <label for="Latitude">Latitude:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Latitude)%>
            <%=Html.ValidationMessage("Latitude", "*") %>
        </p>
        <p>
            <label for="Longitude">Longitude:</label>
            <%=Html.TextBoxFor(model => Model.Dinner.Longitude)%>
            <%=Html.ValidationMessage("Longitude", "*") %>
        </p>
        <p>
            <input type="submit" value="Save"/>
        </p>
    </fieldset>

<% } %>

В любом случае, я часами пробираюсь в это время, и у меня нет идей. Итак, я надеюсь, что кто-то здесь может помочь подтолкнуть меня в правильном направлении, чтобы понять, что я делаю неправильно.

Теги:
asp.net-mvc
asp.net-mvc-2
nerddinner

3 ответа

1
Лучший ответ

У тебя что-то перепуталось. Вы отправляете DinnerFormViewModel для просмотра, но пытаетесь получить Ужин. Измените свой почтовый метод следующим образом:

[AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection formValues)
    {

        var dinner=new DinnerFormViewModel(dinnerRepository.GetDinner(id));

        try
        {
            UpdateModel(dinner);
            var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors

            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.Dinner.DinnerID });
        }
        catch
        {

            ModelState.AddRuleViolations(dinner.GetRuleViolations());

            return View(new DinnerFormViewModel(dinner)); 
        }
    }

Здесь может быть что-то, что я пропустил, не помню DinnerFormViewModel прямо сейчас. Пожалуйста, проверьте эти

edit: На самом деле я понял, что этот пост не решает проблему на самом деле. Код, указанный в вопросе, работает для меня. Существует проблема, но не здесь.

  • 0
    Вы правы, это как-то связано с моим использованием класса DinnerFormViewModel. Я подтвердил это, избавившись от использования этого класса и просто используя вместо этого объект Model.Dinner. Когда я откатил код таким образом, обновление работало нормально. Я действительно хотел бы использовать ViewModel здесь, поэтому я хотел бы знать, что о моем использовании было неправильно. Вы случайно не поняли, как я мог бы реализовать это лучше? Или у вас есть мысли о том, как я мог злоупотреблять этим?
  • 0
    Я не уверена. Я думаю, что-то не так с тем, что сильно набрано мнениями. Что строго типизируется с частичным представлением, редактированием представления и созданием представления?
Показать ещё 1 комментарий
2

dinnerRepository.Save() - это код, который фактически обновляет базу данных. То, что UpdateModel(dinner) делает, извлекает значения из коллекции форм и помещает их в ваш объект dinner.

  • 0
    Благодарю за ваш ответ. Вы правы в отношении взаимодействия между методом dinnerRepository.Save () и методом UpdateModel (ужин). Я знал это, я просто не знал этого достаточно хорошо, чтобы прояснить это различие в моем посте выше :)
1

На всякий случай, это поможет кому-то еще в будущем, проблема здесь не обязательно связана с использованием DinnerFormViewModel, как я подозревал. Скорее, проблема заключалась в использовании сильно типизированных вспомогательных методов, таких как Html.TextBoxFor и способах, которыми я вызывал метод UpdateModel.

Эта проблема и ее решение подробно объясняются в другом потоке в StackOverflow, здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню