ASP.Net MVC Простое редактирование данных из шаблона по умолчанию - PullRequest
0 голосов
/ 04 мая 2009

при создании нового вида и выборе «Изменить шаблон» шаблон создаст текстовое поле для первичного ключа, которое нельзя редактировать.

   <%=Html.TextBox("CompanyID", Model.CompanyID)%>

Таким образом, удаление элемента управления из представления вызовет проблему: коллекция, отправляемая на контроллер, имеет CompanyID = 0, поэтому редактирование не будет. Но если я верну эту строку кода для просмотра, CompanyID в размещенной коллекции будет иметь правильное значение. Я делаю очень похоже на этот урок: http://www.asp.net/learn/mvc/tutorial-21-vb.aspx, и там (серое поле над разделом «Листинг 6 - Контроллеры \ HomeController.vb (Редактировать методы)») говорится, что вы можете удалить элемент управления, но он не работает .. любой совет?

Обновлено Хорошо, для более подробного объяснения, здесь идет 2 проблемы:
задача 1 в этом коде:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal movieToEdit As Movie) As ActionResult

если вы удалите текстовое поле MovieID из вида movieid в коллекции movietoedit всегда равен нулю, поэтому учебник с веб-сайта asp.net работать не будет! если я хочу удалить movieID из вида, я должен передать идентификатор моему контроллеру следующим образом:

 <AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal ID as integer,ByVal movieToEdit As Movie) As ActionResult

теперь я могу запросить модель, используя этот идентификатор ... это не проблема, но мне понадобится несколько раз, чтобы понять, как я делал шаг за шагом с сайта!

Задача 2 Итак, как выполнить редактирование без использования movieID в поле зрения, даже в скрытом текстовом поле?
Я использую это как мой контроллер: (используя платформу Enity)

  <AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal id As Integer, ByVal collection As Company) As ActionResult
    If Not ModelState.IsValid Then
        Return View()
    End If

    Try
        Dim c = _db.CompanySet.FirstOrDefault(Function(m) m.CompanyID = id)

        If c Is Nothing Then
            Return RedirectToAction("index")
        End If



        _db.ApplyPropertyChanges(c.EntityKey.EntitySetName, collection)
        _db.SaveChanges()

        Return RedirectToAction("Index")
    Catch ex As Exception
        Throw ex
    End Try
End Function

И если я удалю CompanyID из своего представления (текстовое поле или скрытое поле), это даст мне эту ошибку из c.EntityKey.EntitySetName:
ObjectStateManager не содержит ObjectStateEntry со ссылкой на объект типа «Companies.Company».
и если я добавлю что-то вроде

  <%= Html.TextBox("CompanyName", Model.CompanyName) %>

все будет работать нормально .. Я в замешательстве!

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

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Учебник правильный, вы не должны оставлять текстовое поле с идентификатором, я думаю, они предполагают, что идентификатор является частью вашего маршрута, например / movies / edit / 1. Если это не так, вы можете добавить его к действию формы, используя коллекцию маршрутов, или добавить скрытое поле в форму.

Добавление идентификатора к маршруту действия редактирования:

    <% using (Html.BeginForm("Edit", "Controller", 
              new {id = Model.Id}, FormMethod.Post))
   { %>

Или скрытое поле:

 <%=Html.Hidden("CompanyID", Model.CompanyID)%>
0 голосов
/ 05 мая 2009

Попробуйте так:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(<Bind(Exclude:="Id")> ByVal movieToEdit As Movie) As ActionResult

Для получения дополнительной информации о ASP.Net MVC см. http://asp.net/learn/mvc

0 голосов
/ 04 мая 2009

Если вы передаете идентификатор и обновляете определенные поля через UpdateModel, он должен работать. Вам лучше опубликовать свой метод редактирования, чтобы мы могли видеть, что происходит. Следующий пример может проиллюстрировать процесс, который я пытался объяснить.

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

    Page page = repo.GetPage(id); // returns page with specific id
    UpdateModel(page); // updates page with new form values
    repo.Save(); // saving all the changes
    return RedirectToAction("Details", new { id = page.id });

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