при создании нового вида и выборе «Изменить шаблон» шаблон создаст текстовое поле для первичного ключа, которое нельзя редактировать.
<%=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 раз, и мне интересно, если я что-то не так делаю или учебник неправильный ..