在ASP.NET 4中更新单个数据库列
本文关键字:单个 数据库 更新 ASP NET | 更新日期: 2023-09-27 17:59:14
我有这个具有必需属性的模型。是的,它们是创建项目所必需的,但当我想更新其中的一列时,我会收到关于必填字段的错误。所以我的控制器似乎想更新所有这些。
在这种情况下,有一件商品在出售,你可以为它出价。
我的模型的一部分:
public class Ad
{
public int AdID { get; set; }
[Required()]
[Display(Name = "Otsikko")]
public string Title { get; set; }
[Required()]
[DataType(DataType.MultilineText)]
[AllowHtml]
[Display(Name = "Kuvaus")]
public string Text { get; set; }
[Required()]
[DataType(DataType.Currency)]
[Display(Name = "Hinta")]
public float Price { get; set; }
[DataType(DataType.Currency)]
[Display(Name = "Tarjottu")]
public float Offer { get; set; }
我的控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Offer([Bind(Include = "Offer")] Ad ad)
{
if (ModelState.IsValid)
{
db.Entry(ad).State = EntityState.Modified;
db.SaveChanges();
return RedirectToRoute("ilmoitus", new { id = ad.AdID });
}
else
{
var message = string.Join(" | ", ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage));
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}
}
部分视图:
@using (Html.BeginForm("Offer", "Ads"))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.AdID)
@Html.EditorFor(model => model.Offer, new { htmlAttributes = new { @class = "form-control offer-input", @placeholder = "Tarjoa..." } })
<button class="btn-default btn offer-btn">Tarjoa {{offer}} €</button>
}
我已经尝试过这个错误如何使用EF 只更新单个字段
我让它像这样工作,将所有其他属性都隐藏起来,并将它们绑定在控制器中:
视图:
@using (Html.BeginForm("Offer", "Ads"))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.AdID)
@Html.HiddenFor(model => model.Title)
@Html.HiddenFor(model => model.Text)
@Html.HiddenFor(model => model.Price)
@Html.HiddenFor(model => model.Location)
@Html.HiddenFor(model => model.PaymentOptions)
@Html.HiddenFor(model => model.DeliveryOptions)
@Html.HiddenFor(model => model.SellerEmail)
@Html.EditorFor(model => model.Offer, new { htmlAttributes = new { @class = "form-control offer-input", @placeholder = "Tarjoa..." } })
<button class="btn-default btn offer-btn">Tarjoa {{offer}} €</button>
}
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Offer([Bind(Include = "AdID,Title,Text,Price,Offer,Location,PaymentOptions,DeliveryOptions,SellerEmail")] Ad ad)
{
if (ModelState.IsValid)
{
db.Entry(ad).State = EntityState.Modified;
db.SaveChanges();
return RedirectToRoute("ilmoitus", new { id = ad.AdID });
}
else
{
var message = string.Join(" | ", ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage));
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}
}
这是安全问题吗?
对于上述查询,我有两个解决方案。
-
您可以使用两种不同的型号来更新和插入示例
-
从ModelState中删除属性,然后TryUpdateModel
public ActionResult UpdateAd(Ad ad) { ModelState.Remove("Title"); ModelState.Remove("Text"); ModelState.Remove("Price"); var p = GetAd(); if (TryUpdateModel(p)) { //Save Changes; } }