【问题标题】:GridView w/ model binding UpdateMethod not getting called没有调用带有模型绑定 UpdateMethod 的 GridView
【发布时间】:2016-10-25 18:01:12
【问题描述】:

我有一个基本的 Web 窗体项目,它使用实体框架和 SQL Server 获取数据。我正在尝试将 GridView 连接到表,并且由于某种原因没有调用 UpdateMethod。单击“更新”链接时它会进行回发,但它永远不会到达 gvNames_UpdateItem。任何帮助将不胜感激。

<asp:GridView ID="gvNames" runat="server" SelectMethod="gvNames_GetData" UpdateMethod="gvNames_UpdateItem"
    DeleteMethod="gvNames_DeleteItem" CssClass="table table-hover table-striped"
    UseAccessibleHeader="true" ItemType="CountyPMFraudData.NotifyName" AutoGenerateColumns="false" DataKeyNames="NotifyNamesID" 
    ShowHeaderWhenEmpty="true" OnPreRender="gvNames_PreRender" >
    <Columns>
        <asp:DynamicField DataField="NotifyNamesID" Visible="false" />
        <asp:DynamicField DataField="UserID" Visible="false" />
        <asp:DynamicField DataField="CorpFlag" HeaderText="Business" />
        <asp:DynamicField DataField="FirstName" />
        <asp:DynamicField DataField="LastName" HeaderText="Last Name/Business Name" />
        <asp:DynamicField DataField="Active" HeaderText="Active" />
        <asp:CommandField ShowEditButton="true" ShowCancelButton="true" ShowDeleteButton="true"/>
    </Columns>
</asp:GridView>

这是背后的代码:

public void gvNames_DeleteItem(int notifyNamesID)
{
    using (var dbContext = new CountyPMFraudEntities())
    {
        var item = new NotifyName { NotifyNamesID = notifyNamesID };
        dbContext.Entry(item).State = EntityState.Deleted;

        try
        {
            dbContext.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            ValidationError.Display(String.Format("Item with id {0} no longer exists in the database.", notifyNamesID));
        }
    }
}

public IEnumerable gvNames_GetData()
{
    List<NotifyName> names = null;

    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {                

        using (var dbContext = new CountyPMFraudEntities())
        {
            names = dbContext.NotifyNames.Where(NotifyName => NotifyName.UserID == _userID).ToList();
        }
    }

    return names;
}

public void gvNames_UpdateItem(int notifyNamesID)
{

    using (var dbContext = new CountyPMFraudEntities())
    {
        var name = dbContext.NotifyNames.Find(notifyNamesID);

        if (name == null)
        {                    
            ValidationError.Display(String.Format("Item with id {0} was not found", notifyNamesID));
            return;
        }

        TryUpdateModel(name);

        if (ModelState.IsValid)
        {
            dbContext.SaveChanges();
        }

    }
}

protected void gvNames_PreRender(object sender, EventArgs e)
{
    try
    {
        gvNames.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
    catch (Exception)
    {
        //Just ignore becuase there is no data.
    }

}

【问题讨论】:

    标签: c# asp.net gridview webforms model-binding


    【解决方案1】:

    好的,我想通了。发生了两件事。首先,我错过了添加“ValidationSummary”并像这样启用 ShowModelStateErrors:

    <asp:ValidationSummary ID="vsHuman" ShowModelStateErrors="true" ValidationGroup="vgHuman" runat="server" ForeColor="Red" />
    

    一旦我这样做了,我意识到我收到了一个错误“NotifyNamesID 字段是必需的。”。有了这个我发现由于某种原因隐藏的“DynamicField”在返回服务器时不包含数据,所以我不得不将它更改为这样的 TemplateField:

    <asp:TemplateField Visible="false">
        <ItemTemplate>
            <asp:HiddenField runat="server" Value='<%#Eval("NotifyNamesID") %>' />
        </ItemTemplate>
    </asp:TemplateField>
    

    一旦我这样做了,事情就开始起作用了。希望这对将来的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2013-09-04
      相关资源
      最近更新 更多