C# 在ASP.NET 4中更新单个数据库列
我有一个具有所需属性的模型。是的,它们是创建项所必需的,但是当我想更新其中的一列时,我会得到关于必填字段的错误。因此,我的控制器似乎想要更新所有这些 在这种情况下,有一个项目出售,你可以提出一个报价 我的模型的一部分:C# 在ASP.NET 4中更新单个数据库列,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个具有所需属性的模型。是的,它们是创建项所必需的,但是当我想更新其中的一列时,我会得到关于必填字段的错误。因此,我的控制器似乎想要更新所有这些 在这种情况下,有一个项目出售,你可以提出一个报价 我的模型的一部分: public class Ad { public int AdID { get; set; } [Required()] [Display(Name = "Otsikko")] public string Title { get; set; }
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);
}
}
[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);
}
}
部分意见:
@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>
}
@使用(Html.BeginForm(“提供”、“广告”))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model=>model.AdID)
@EditorFor(model=>model.Offer,new{htmlAttributes=new{@class=“formcontrol-Offer-input”,@placeholder=“Tarjoa…”})
Tarjoa{{offer}}
}
我用同样的错误尝试了这个我让它像这样工作,包括隐藏的所有其他属性,并将它们绑定到控制器中:
[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);
}
}
[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; } }