由于某些原因,下面的编辑操作可以很好地进入编辑视图表单,但是当我在视图页面上单击提交以发布下面的第二个方法时,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">
发布于 2009-09-06 08:02:47
您必须在编辑表单上有id字段,所以只需将其放在下面
<%=Html.Hidden("CompanyID",Model.CompanyID) %>
发布于 2009-09-07 09:32:05
您可以将id存储在Edit (get)方法的会话中,然后将其放回Edit (post)方法的Company对象中
发布于 2009-09-07 10:08:22
对于您在评论中建议的ID猜测,显而易见的解决方案是向Model
添加另一个名为Key
或类似的字段,并将其设置为Guid
,例如
public class User
{
public int Id {get;set;}
public Guid Key {get;set;}
}
然后,您可以将其用作视图中的隐藏字段。使其成为数据库中的索引列将使您受益(理想情况下,您将使其成为非聚集主键,并丢弃Id
字段的int
)。
然后你的观点是:
<%=Html.Hidden("Key",Model.Key) %>
应该在Controller
方法发布时自动填充该方法的参数。如果没有,那么可能存在表单标签问题。
https://stackoverflow.com/questions/1384981
复制