簡體   English   中英

使用TryUpdateModel方法在ASP.NET MVC 3中使用EntityFramework更新多個對象

[英]Update multiple objects using EntityFramework in ASP.NET MVC 3 with TryUpdateModel method

在嘗試通過Entity Framework更新數據時,我正在努力使用ASP.NET MVC3。 過程如下:

我有這個型號:

    public class Bet
    {
       public string BetID { get; set; }
       public int FixtureID { get; set; }
       public string Better { get; set; }
       public int GoalsHome { get; set; }
       public int GoalsGuest { get; set; }

       public virtual Fixture { get; set; }

    }

在控制器中,我通過where語句過濾表,只獲得與用戶匹配的entrys:

    [HttpGet]
    public ActionResult Index()
    {
        var user = User.Identity.Name;
        var model = _db.Bets.Where(t => t.Better == user);

        return View(model);
    }

View是兩部分,一部分負責表頭,另一部分列出用戶的所有賭注:

<fieldset>
    <legend>Bets</legend>
    <table>
        <tr>
            <th>
                Kickoff
            </th>
            <th>
                Home Team
            </th>
            <th>
                Guest Team
            </th>
            <th>
                Group
            </th>
            <th>
                Bet
            </th>
        </tr>
        @Html.EditorFor(m => m)  //this is resolved in an self made EditorTemplate
  </table>

EditorTemplate:

@model Betting.Models.Bet
<tr>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.Kickoff)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.HomeTeam)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.GuestTeam)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.Group)
</td>
<td>
    @Html.TextBoxFor(modelItem => Model.GoalsHome, new { style = "width: 30px" }):
    @Html.TextBoxFor(modelItem => Model.GoalsGuest, new { style = "width: 30px" })
</td>
    @Html.HiddenFor(modelItem => Model.FixtureID)
</tr>

回到控制器,我嘗試更新模型:

    [HttpPost]
    public ActionResult Index(FormCollection collection)
    {
        var user = User.Identity.Name;
        var model = _db.Bets.Where(t => t.Better == user);
        TryUpdateModel(model);
        _db.SaveChanges();

        return RedirectToAction("Index");
    }

這絕對沒有。 實體框架根本不會更新數據庫。 我甚至將表格分開,以便html文件中的結果下注標簽可以區分(注意名稱值之前的[index]:

 <input data-val="true" data-val-number="The field GoalsHome must be a number." data-val-required="The GoalsHome field is required." name="[1].GoalsHome" style="width: 30px" type="text" value="3" />:
 <input data-val="true" data-val-number="The field GoalsGuest must be a number." data-val-required="The GoalsGuest field is required." name="[1].GoalsGuest" style="width: 30px" type="text" value="0" />

有人可以告訴我為什么實體框架沒有更新數據庫? 對象映射有問題嗎?

我之前遇到過同樣的問題。 MSDN在這個問題上可能會讓人感到困惑,但在頁面的中間部分表示,如果您在沒有proxycreationenabled的情況下創建POCO實體,則必須在調用savechanges之前調用detectchanges。

TryUpdateModel(model);
_db.DetectChanges();
_db.SaveChanges();

好吧,似乎我找到了一種不使用TryUpdateModel方法更新數據庫的方法。 由於在html帖子中發送的項目是可區分的,我可以在控制器方法中添加一個參數,該方法保存從視圖中獲得的投注。 然后我迭代數據庫中的結果,並從視圖中更新使用投注的字段值更改的字段:

    [HttpPost]
    public ActionResult Index(FormCollection collection, List<Bet> bets)
    {
        var user = User.Identity.Name;
        var model = _db.Bets.Where(t => t.Better== user);
        int i = 0;
        foreach (var bet in model)
        {
            Bet the_Bet= bets.Find(
                delegate(Bet _bet)
                {
                    return _bet.BetID == bet.BetID;
                });
            bet.GoalsHome= the_Bet.GoalsHome;
            bet.GoalsGuest= the_Bet.GoalsGuest;
            i++;
        }
        _db.SaveChanges();

        return RedirectToAction("Index");
    }

我想知道是否還有辦法讓它與TryUpdateModel方法一起工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM