【问题标题】:ASP.NET Binding DataSource to entire page with a single recordASP.NET 将数据源绑定到具有单个记录的整个页面
【发布时间】:2013-02-22 00:37:19
【问题描述】:

我们目前在aspx页面中使用asp:Repeater<%#Eval("SomeField")%>来显示数据。

我们想使用单个记录并将其绑定到 aspx 页面上的 asp.net 控件,以便我们可以<%#Eval("SomeField")%>

我尝试过FormViewDetailsView 和其他asp.net 控件。所有这些都需要.ToList()IEnumerable。但是,我们返回ctx.Jobs.SingleOrDefault(j => j.ID == id);

我们不想使用 asp:Label 或 asp:Literal ..

返回单条记录时页面中的<%#Eval("SomeField")%>怎么办?

演示者

    public static Job GetByID(int id)
    {
        using (var ctx= new CareersEntities())
        {
            return ctx.Jobs.SingleOrDefault(j => j.ID == id);
        }
    }

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
       Job d = new Job();
        d = JobPresenter.GetByID(ID);

        fvJob.DataSource = d;
        fvJob.DataBind();
}

ASPX 页面

<asp:FormView  ID="fvJob" runat="server">
     <ItemTemplate>
        <%#Eval("Title")%>
     </ItemTemplate>
</asp:FormView>

【问题讨论】:

  • 是否有任何特殊原因排除使用简单标签?如果您只有一条记录,则将其直接绑定到页面。

标签: asp.net data-binding web-controls


【解决方案1】:

如果DetailsViewFormView 使用数据源控件(如ObjectDataSource),则它都将与单个对象一起使用。使用 ObjectDataSource,您可以从 Select 方法返回单个元素,然后数据源会将其包装在一个列表中,只是为了编程接口——但这不是您所见过的。

如果你想直接设置控件的DataSource属性并调用DataBind,只需将对象包装在一个数组中,然后传入即可。

这是详细信息视图:

<asp:DetailsView runat="server" ID="DetailsView1" AutoGenerateRows="false">
    <Fields>
        <asp:TemplateField HeaderText="First name:">
            <ItemTemplate><%# Eval("FirstName") %></ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Last name:">
            <ItemTemplate><%# Eval("LastName") %></ItemTemplate>
        </asp:TemplateField>
    </Fields>
</asp:DetailsView>

这是 Page_Load 中的 DetailsView 绑定代码:

var person = new Person { FirstName = "John", LastName = "Doe" };
DetailsView1.DataSource = new object[] { person };
DetailsView1.DataBind();

或者这里是一个 FormView:

<asp:FormView runat="server" ID="FormView1">
    <ItemTemplate>
        First name: <%# Eval("FirstName") %><br />
        Last name: <%# Eval("LastName") %><br />
    </ItemTemplate>
</asp:FormView>

这是 Page_Load 代码:

var person = new Person { FirstName = "John", LastName = "Doe" };
FormView1.DataSource = new object[] { person };
FormView1.DataBind();

这是模型类型(在 DetailsView 和 FormView 中相同):

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

【讨论】:

  • 我想严格地在代码隐藏中进行绑定,就像我在 Repeater 中所做的那样。 --
  • @David 我也添加了 DetailsView 示例。
  • 查看我的更新,我添加了获取记录的演示者方法。直接与 asp:FormView 一起使用时,它不起作用。
  • @David 你能澄清什么与你的问题不兼容吗?在我的回复中,我展示了模型在 Page_Load 中的设置位置 - 只需将其更改为调用您的演示者逻辑,您应该一切顺利,不是吗?
  • 这是我得到的确切错误:数据源是无效类型。它必须是 IListSource、IEnumerable 或 IDataSource。 --我还在上面的问题中添加了代码隐藏。
【解决方案2】:

DetailsView 需要一个列表?!无论如何,你为什么不使用 ctx.Jobs.SingleOrDefault(j => j.ID == id).ToList() ?

【讨论】:

  • 我正在尝试使用 DetailsVies::DetailsView> EVAL 不起作用。做 Single 然后 .ToList() 似乎是错误的——似乎我在强迫一些不应该的事情。
  • 您不能在 SingleOrDefault(...) 的结果上调用 ToList()(或 Single(...) ),因为它通常不返回 IEnumerable 实例。所有数据绑定控件都需要一个 IEnumerable 作为 DataSource(在 DataBoundControlBase 上声明),包括 DetailsView 和 FormView。
  • 我有一个名为 Cons 的方法,它接受 T 并为此返回 IEnumerable。它的作用是 new T[] { param }.
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 2017-12-12
  • 2016-12-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多