代码之家  ›  专栏  ›  技术社区  ›  Geo

为什么我的ASP.NET MVC应用程序中的编辑代码不工作?

  •  0
  • Geo  · 技术社区  · 15 年前

    出于某种原因,下面的编辑操作可以进入编辑视图表单,但是当我点击视图页面上的提交来发布下面的第二个方法时,CompanyToEdit结构不包含CompanyID,我得到一个异常。这很奇怪,因为我以前做过,在其他情况下我得到了ID字段。

    如果我把下面代码的部分放在视图中:

                <p>
                    <label for="CompanyID">CompanyID:</label>
                    <%= Html.TextBox("CompanyID", Model.CompanyID) %>
                    <%= Html.ValidationMessage("CompanyID", "*") %>
                </p>
    

    那就行了。但是如果我把它拿走,因为companyID是一个只读字段,它将停止工作。有什么想法吗?

        //
        // GET: /Company/Edit/5
    
        public ActionResult Edit(int id)
        {
            var companyToEdit = _repository.GetCompany(id);
            return View(companyToEdit);
        }
    
        //
        // POST: /Company/Edit/5
    
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int id, Company companyToEdit)
        {
            if (!ModelState.IsValid)
                return View();
            try
            {
                _repository.Update(companyToEdit);
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    

    编辑2: 我想我可以做类似的事情,将ID隐藏在一个散列值中,比如下面的散列值。我认为这将是最终的解决方案,在这里我们将获得最安全和更少的复杂性。

    <input id="fkey" name="fkey" type="hidden" value="4a3d337bf38b35e9ff4167cfa878160b">
    
    5 回复  |  直到 11 年前
        1
  •  0
  •   Omu    15 年前

    您必须在编辑表单上有ID字段 所以就这么说吧

    <%=Html.Hidden("CompanyID",Model.CompanyID) %>
    
        2
  •  0
  •   Omu    15 年前

    您可以将ID存储在edit(get)方法的会话中,并将其放回edit(post)方法的company对象中。

        3
  •  0
  •   Chris S    15 年前

    对于您在注释中建议的ID猜测,最明显的解决方案是将另一个字段添加到 Model 打电话 Key 或类似的,并使其成为 Guid ,例如

    public class User
    {
        public int Id {get;set;}
        public Guid Key {get;set;}
    }
    

    然后可以将其用作视图中的隐藏字段。您将从使其成为数据库中的索引列中获益(理想情况下,您将使其成为非聚集主键,并放弃 int 对于 Id 字段)。

    那么你的看法是:

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

    应自动填充的参数 Controller 方法。如果没有,则可能存在表单标记问题。

        4
  •  0
  •   RP    15 年前

    变量名应与文本框对象名匹配,该对象名是companyID或use request,form(“companyID”)。

        5
  •  -1
  •   David Andres    15 年前

    尝试将文本框的名称从CompanyID更改为CompanyToEdit.CompanyID。还要确保这些字段包含在表单中(即,使用html.begininform)。