Asp.net mvc ASP.NET MVC持久化mdoel';编辑时的ID值
我在第一个编辑方法中检索Item的副本,该方法将包含ItemID的值。但是当它到达HttpPost方法时,id值丢失了 如果切换到Asp.net mvc ASP.NET MVC持久化mdoel';编辑时的ID值,asp.net-mvc,Asp.net Mvc,我在第一个编辑方法中检索Item的副本,该方法将包含ItemID的值。但是当它到达HttpPost方法时,id值丢失了 如果切换到 public Edit(int? id){ /* Codes */ } [HttpPost] public Edit(Item model){ /* Codes */ } 这样,ItemID就可以持久化到Item模型中。 但这是一个好办法吗?ASP.NET MVC是否总是能够知道它需要将“ItemID”插入到Item中? 还有其他方法来保持ID值吗?谢谢。我无法
public Edit(int? id){ /* Codes */ }
[HttpPost]
public Edit(Item model){ /* Codes */ }
这样,ItemID就可以持久化到Item模型中。
但这是一个好办法吗?ASP.NET MVC是否总是能够知道它需要将“ItemID”插入到Item中?
还有其他方法来保持ID值吗?谢谢。我无法理解您是如何在HttpPost处理中丢失id的。也许你应该检查一下你的活页夹,可能自己写一本?根据我的经验,默认活页夹有点麻烦。尽管我不认为这是最好的解决方案,但你可以从开始。如果您需要手动编写许多活页夹,请查看一些可以帮助您以声明方式进行转换的工具,如。您是否尝试将id作为参数添加到Post操作中
public Edit(int? ItemID){ /* Codes */ }
[HttpPost]
public Edit(Item model){ /* Codes */ }
这样,当表单发回时,将从URL填充id。有一篇帖子可能与您正在做的事情相关,也可能与您所做的事情无关
此外,如果您没有将ID作为表单的一部分(隐藏字段或诸如此类的内容)发送给客户端,并且它不是POST URL的一部分,那么只有在POST上没有正确填充ID字段才有意义。您的
项目
模型上的属性称为项目ID
?如果是这样,那么如果您正在传递一个名为ID
的字段,则默认模型绑定器将不会填充它。如果更改方法签名,使参数名称与项匹配,则它应按预期工作。解决ID问题的MVC 2方法是
如果您仍然使用MVC 1,请在方法参数上使用绑定属性:
public Edit(int? id){ /* Codes */ }
[HttpPost]
public Edit(int id, Item model){ /* Codes */ }
有点晚回答,但在使用razor时,通常使用隐藏字段将Id绑定到模型
[HttpPost]
public ActionResult Edit([Bind(Exclude = "ItemID")] Item model)
{
// ...
}
完整的表单帖子可以如下所示:
@Html.HiddenFor(model => model.Id)
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
地址
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@Html.HiddenFor(model=>model.Id)
@LabelFor(model=>model.Name,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.Name,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Name,“,new{@class=“text danger”})
@LabelFor(model=>model.StreetLine1,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.StreetLine1,new{htmlAttributes=new{@class=“form control”}})
@Html.ValidationMessageFor(model=>model.StreetLine1,“,new{@class=“text danger”})
}
请查看提交表单中的数据是否正确映射到第二个编辑方法中的模型对象。在这种情况下,Item model参数有点奇怪。一点也不奇怪。这是一种非常合法的获取id的方式。考虑到你要访问一个已经包含id的URL,为什么不使用id发回呢?我就是这样做的。只需确保检查id上的权限,因为它可以很容易地更改-这适用于任何方法,它并不特定于此方法。我同意这看起来不太正确,因为该方法现在接受两个id。如果您遵循约定,模型上的id应该由模型绑定器设置。在我看来,您不应该将任何模型传递给包含确定编辑帖子id的视图。您应该使用只包含用于设置相对URL的ID的视图模型,尽管我承认这是个人偏好。
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Address</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.Id)
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.StreetLine1, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.StreetLine1, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.StreetLine1, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}