ASP.Net MVC简单编辑默认模板中的数据

时间:2009-05-04 09:37:52

标签: asp.net-mvc

创建新视图并选择编辑模板时,模板将为主键创建一个不可编辑的文本框。

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

因此,从视图中删除控件会导致问题:发布到控制器的集合具有CompanyID = 0,因此不会进行编辑。 但是,如果我放回要查看的代码行,则已过帐集合中的CompanyID具有适当的值。我做的很像这个教程: http://www.asp.net/learn/mvc/tutorial-21-vb.aspx,那里(清单6 - Controllers \ HomeController.vb(编辑方法)部分上面的灰色框)它说你可以删除控件,但它不工作..有什么建议吗?

更新 好的,更多的解释,这里有两个问题:
此代码中的问题1

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

如果从视图中删除MovieID文本框,movietoedit集合中的movieid始终为零,那么来自asp.net网站的tortortial将无法正常工作!如果我想从视图中删除movieID,我必须将ID传递给我的控制器,如下所示:

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

现在我可以使用这个ID查询Model ..这没问题,但是我需要花一些时间来搞清楚,因为我正在从网站上一步一步地做!

问题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 个答案:

答案 0 :(得分:2)

教程是对的,你不应该留下带有id的文本框,我认为他们假设id是你路线的一部分,比如/ movies / edit / 1。如果不是这种情况,您可以使用路径集合将其添加到表单操作中,或者在表单中添加隐藏字段。

将id添加到编辑操作的路径:

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

或隐藏字段:

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

答案 1 :(得分:0)

如果您通过UpdateModel传递id并更新特定字段,它应该可以工作。您最好发布您的编辑方法,让我们看看发生了什么。下面的例子可以说明我试图解释的过程。

[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 });

}

答案 2 :(得分:0)

尝试这种方式:

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

有关ASP.Net MVC的更多信息,请参阅http://asp.net/learn/mvc