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

时间:2009-09-06 05:58:29

标签: asp.net asp.net-mvc

出于某种原因,下面的编辑操作可以很好地进入编辑视图表单,但是当我在我的视图页面上点击提交以发布下面的第二个方法时,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 个答案:

答案 0 :(得分:0)

您必须在编辑表单上包含id字段 所以就这样说吧

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

答案 1 :(得分:0)

您可以在编辑(获取)方法中将ID存储在会话中,并将其放回编辑(后)方法的公司对象中

答案 2 :(得分:0)

您在评论中建议的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方法的参数。如果没有,那么可能存在表单标签问题。

答案 3 :(得分:0)

变量名称应与文本框对象名称匹配,即CompanyID或使用请求,表单(“CompanyID”)

答案 4 :(得分:-1)

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