ASP.NET MVC 2 UpdateModel () не обновляет значения в памяти или базе данных - PullRequest
2 голосов
/ 30 мая 2010

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

Как ни странно, у меня нет проблем с функциями «Создать» или «Удалить», показанными в руководстве. Только функция обновления не работает.

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

Вот код внутри моего контроллера, называемый 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)); 
        }
    }

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

Модель обновления ASP.NET MVC не обновляется, но не выдает ошибку

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

Вот соответствующая разметка в моем Dinners / Edit.aspx View:

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

    <h2>Edit Dinner</h2>

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

</asp:Content>

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

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

<% } %>

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

Ответы [ 3 ]

2 голосов
/ 30 мая 2010

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

1 голос
/ 30 мая 2010

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

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

1 голос
/ 30 мая 2010

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

[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: На самом деле я понял, что этот пост действительно не решает проблему. Код, размещенный в вопросе, работает для меня. Есть проблема, но не здесь.

...