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