1

我有一个 DetailView 返回插入参数:

<InsertParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="Capital" Type="String" />
            <asp:Parameter Name="Currency" Type="String" />
            <asp:Parameter Name="ISOCode" Type="String" />
</InsertParameters>

方法:

public void AddCountry(string Name, string Capital, string Currency, string ISOCode)
        {
           CountyList.Add(new Country(Name, Capital, Currency, ISOCode)));
        }

但是如何强制 DetailsView 返回自定义类?

public void AddCountry(Country country)
        {
            CountyList.Add(country);
        }
4

2 回答 2

1

您强制使用属性返回 Class:TypeNameDataObjectTypeNameof ObjectDataSource。无需指定任何插入参数。

在您的文件夹中创建一个类,App_Code将各个字段声明为可公开访问。例如:

类文件Country.cs,声明字段

public class Country
{
public Country()
{

}
private string name;
public string Name
{
    get { return name; }
    set { name= value; }
}

private string capital;
public string Capital
{
    get { return capital; }
    set { capital= value; }
}

private string currency;
public string Currency
{
    get { return currency; }
    set { currency= value; }
}

private string iSOCode;
public string ISOCode
{
    get { return iSOCode; }
    set { iSOCode= value; }
}      
}

现在在您的 Insert Method:AddCountry()中,只需传递上述类的一个实例,如下所示。Class_variable_Name.Public_Field_Name使用如下所示访问字段值 。

public void AddCountry(Country country)
    {
// a sample code to access the values from Class instance passed in this method
    string connString = WebConfigurationManager.ConnectionStrings["MyConnections"].ConnectionString;
    SqlConnection con = new SqlConnection(connString);
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "Insert into Country(Name, Capital,Currency,ISOCode)  
                       values(@Name,@Capital,@Currency,@ISOCode)";
    cmd.Connection = con;

   // Add the insert parameters
    cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar, 20));

   // specify the values for insert parameters
   // using the Country class passed as parameter to this method 
    cmd.Parameters["@Name"].Value = country.Name; // country.Public_Field_Name

    cmd.Parameters.Add(new SqlParameter("@Capital", SqlDbType.NVarChar, 20));
    cmd.Parameters["@Capital"].Value = country.Capital;
    cmd.Parameters.Add(new SqlParameter("@Currency", SqlDbType.NVarChar, 20));
    cmd.Parameters["@Currency"].Value = country.Currency;
    cmd.Parameters.Add(new SqlParameter("@ISOCode", SqlDbType.NVarChar, 20));
    cmd.Parameters["@ISOCode"].Value = country.ISOCode;

    con.Open();
    // execute the Insert Command
      cmd.ExecuteNonQuery();    
  }

显然,在您的ObjectDataSource控件中,您需要指定属性:TypeName, DataObjectTypeName.

1.)TypeName表示包含数据访问方法的类的名称,表示包含您的方法的类文件:AddCountry()

2.) :获取或设置控件在、或数据操作中用于参数DataObjectTypeName的类的名称,而不是从数据绑定控件传递单个值。在我们的例子中,这是上面创建的类。ObjectDataSourceupdateinsertdeleteCountry

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
   DataObjectTypeName="Country"
   InsertMethod="AddCountry"
   TypeName="CountryAccessMethods" <!-- assuming you have defined your Insert,
  Update,Delete methods inside a class file named `CountryAccessMethods` -->
</asp:ObjectDataSource> 
于 2013-09-25T12:41:08.457 回答
1

是答案。

在您的业务对象中,使用长参数列表创建将控制值一对一映射到数据存储值的方法可能会导致代码难以重用。更好的做法是将数据封装在自定义类中,然后将类的实例作为参数传递。这样,构成类实例的数据(例如员工记录)可以更改,而无需对数据源对象公开的公共接口进行任何更改。

虽然不能将参数的 Type 设置为自定义类的名称,但可以将 ObjectDataSource 控件的 DataObjectTypeName 属性设置为自定义的用户定义类型的名称,例如 NorthwindEmployee 类,然后传递该类型的实例到业务对象数据方法。要将用户定义的对象传递给数据源对象,必须满足以下条件:

  • 用户定义的类型必须有一个默认构造函数(一个不带参数的构造函数)。

  • 用户定义类型必须定义公共属性,其名称与从数据绑定控件(如 GridView 和 DetailsView)传递到数据源控件的字典条目的名称相匹配。有关这些字典的详细信息,请参阅将参数与数据源控件一起使用。

  • 数据源对象的公共属性必须同时公开 get 和 set 访问器。

因此,在我的情况下,只有当对象的公共属性同时公开 get 和 set 访问器时,我才能传递 Country 对象。只有 getter 是公共的,而 setter 是通过构造函数初始化的。这是无法做到的:通过对象构造函数传递值。最后,问题出在其他地方:在 ObjectDataSource 而不是在 DetailsView 组件中。

于 2013-09-27T08:50:03.607 回答