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;
        }
     }
    

您能公布准确的错误吗?在你的链接问题中,我也没有发现错误消息。我认为问题在于你没有在html表单中包含广告实体的所有属性,因此帖子丢失了值。i、 e.@Html.HiddenFor(model=>model.Price)错误只是“x字段是必需的”。但是,嘿,谢谢,现在可以用了。我将所有值添加为隐藏,并将所有值绑定到控制器中。这似乎有点傻,不是很安全的方式,但我知道,它的工作!