Как использовать службу WCF в веб-форме и заполнить BulletedList возвращенным списком <T>из WCF? - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь использовать Сервисы на веб-странице, но маркированный список печатает "ASPWebApp.CottagesServiceReference.Cottages" или System.collections.Generic.List 1. Очевидно, я хочу, чтобы он отображал элементы, выбранные из запроса на выборку в сервисе.

   protected void BtnID_Click(object sender, EventArgs e)
    {
        int id = Convert.ToInt32(TextBoxID.Text);
        try
        {

            List<ASPWebApp.CottagesServiceReference.Cottages> cottages = ws.GetCottageInfoByID(id).ToList();

            ListItem cottage = new ListItem(String.Join(".", cottages));

            BulletedList1.Items.Add(cottage);

            BulletedList1.DataSource = cottages;
            BulletedList1.DataBind();


        }
        catch (Exception a)
        {
            Console.WriteLine(a);
        }
    }

Услуги

public List<Cottages> GetCottageInfoByID(int id)
    {
        List<Cottages> cottage = new List<Cottages>();

        SqlConnection conn = new SqlConnection(dataSource);

        string sqlQuerySelectCottageInfo = "SELECT Cottage_Name as 'Name', Cottage_Location as Location, No_Of_Rooms as Rooms, Description, Cost_Per_Night as Cost FROM dbo.Cottages where Cottage_ID = @id";

        SqlCommand cmd = new SqlCommand(sqlQuerySelectCottageInfo);
        cmd.Parameters.AddWithValue("@id", id);

        conn.Open();

        cmd.Connection = conn;

        SqlDataReader reader = cmd.ExecuteReader();


        while (reader.Read())
        {
            if (!reader.HasRows)
            {
                throw new Exception("No Cotteges Found");
            }
            else
            {

                cottage.Add(new Cottages()
                {
                    Name = (reader[("Name")].ToString()),
                    Location = (reader[("Location")].ToString()),
                    Rooms = Convert.ToInt32(reader[("Rooms")]),
                    Cost = Convert.ToDecimal(reader[("Cost")]),
                    Description = (reader[("Description")].ToString()),

                });

            }

        }

        reader.Close();

        conn.Close();

        return cottage;
    }

HTML

<td class="Column2" colspan="1">
                <asp:TextBox class="TxtID" ID="TextBoxID" runat="server" BorderColor="Gray" BorderStyle="Solid" BorderWidth="2px" CausesValidation="False"></asp:TextBox>
                <asp:Button class="BtnID" ID="BtnID" runat="server" Text="Search" OnClick="BtnID_Click" />
                <asp:BulletedList class="Bullets" ID="BulletedList1" runat="server">
                </asp:BulletedList>
            </td>

точка останова показала, что информация о коттедже передается в List<ASPWebApp.CottagesServiceReference.Cottages> из метода ws.GetCottageInfoByID.

Почему после этого он не печатает в маркированный список?

ТИА!

Редактировать **

Получил работу, используя этот подход:

   CottagesServiceReference.Cottages cottages = ws.GetCottageInfoByID(id);

            //Populate bulleted list with Cottages class
            BulletedList1.Items.Clear();
            BulletedList1.Items.Add(cottages.Name);
            BulletedList1.Items.Add(cottages.Location);
            BulletedList1.Items.Add(cottages.Rooms.ToString() + " Rooms");
            BulletedList1.Items.Add(cottages.Description);
            BulletedList1.Items.Add("£" + cottages.Cost.ToString() + ".00");

Что сейчас кажется очень простым и доставило мне столько хлопот ...

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Это проблема с веб-формой, когда вы хотите отобразить свойство настроенного класса в bulletedlist, вам следует установить для DataTextField в bulletedlist имя этого свойства.

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            List<Cottages> list = new List<Cottages>();
            list.Add(new Cottages { MyText = "text1", MyValue = "value1" });
            list.Add(new Cottages { MyText = "text2", MyValue = "value2" });
            list.Add(new Cottages { MyText = "text3", MyValue = "value3" });

           ***BulletedList1.DataTextField = "MyText";***
            BulletedList1.DataSource = list;
            BulletedList1.DataBind();
        }
    }


public class Cottages{
    public string MyValue { get; set; }
    public string MyText { get; set; }
}

Результат.enter image description here

0 голосов
/ 28 апреля 2019

У вас есть логические ошибки в обработчике btnID_Click.

protected void BtnID_Click(object sender, EventArgs e)
{
    int id = Convert.ToInt32(TextBoxID.Text);
    try
    {
        List<ASPWebApp.CottagesServiceReference.Cottages> cottages = 
           ws.GetCottageInfoByID(id);//.ToList(); it is List<Cottages> already 

        //the next line makes no sense 
        //ListItem cottage = new ListItem(String.Join(".", cottages));

        //What should work
        foreach(Cottages cottage in cottages)
        {
           ListItem li = new ListItem(string.Format("{0}, {1} rooms", cottage.Name, cottage.Rooms)); //add more properties of the cottage here
           BulletedList1.Items.Add(li);
        }

        //no need
        //BulletedList1.DataSource = cottages;
        //BulletedList1.DataBind();


    }
    catch (Exception a)
    {
        //there is no visible console in WebForm application
        //Console.WriteLine(a);
       Trace.Write(a);
    }
}

Как правило, BulletedList - не лучший выбор для связывания сложных структур.
Я бы порекомендовал DataList или Repeater с ItemTemplate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...