【问题标题】:consume web service in xamarin.forms json在 xamarin.forms json 中使用 Web 服务
【发布时间】:2016-06-28 10:26:02
【问题描述】:

我想在按钮名称和图像徽标上的列表视图中显示源的值,因为我绑定了图像源和名称。但是似乎没有显示任何结果。

public async Task<string> GetRequest (string url){
    Uri geturi = new Uri("http://172.20.129.193/nypstudentlifeservice/"); 
    HttpClient client = new HttpClient();
    HttpResponseMessage responseGet = await client.GetAsync(geturi);
    return responseGet.Content.ReadAsStringAsync().Result;
}

public async Task<IEnumerable<CsClubList>> getClubList()
{
    string result = await GetRequest("api/club/list?categoryid=2");

    CsClubList[] clublist = null;

    var clubtoken = JObject.Parse(result)[0];

    clublist = clubtoken.Select(clublists => new CsClubList()
    {
        Id = (int)clublists["Id"],
        Name = (string)clublists["Name"],
        Logo = (string)clublists["Logo"],
        CategoryId = (int)clublists["CategoryId"]
    }).ToArray();

    return clublist;
}

这是我尝试使用 Json Web 服务的代码。

这是CsClubList的类文件

public class CsClubList
{
    public int Id{ get; set;}
    public int CategoryId { get; set; }
    public string Name {get; set;}
    public string Logo {get; set;}
}

对于 xaml.cs 文件

public partial class ListClubs : ContentPage
{
    private IEnumerable<CsClubList> _ClubList;

    public ListClubs ()
    {
         InitializeComponent();
         setClubs(Clublistview); //The statement is not awaited and execution of current method continues before the call is complete. Consider using 'await' operator or calling 'Wait' method
    }


    public IEnumerable<CsClubList> ClubList 
    {
        get { return _ClubList; }
        set { _ClubList = value; }
    }

    private async void setClubs(ListView listview)
    {
        ClubApiClient service = new ClubApiClient();
        var clublist = await service.getClubList();
        listview.ItemsSource = clublist.ToList();
    }
}

这是 xaml 页面:

<ListView  x:Name="Clublistview">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout BackgroundColor="White"
                    Orientation="Vertical">
                        <StackLayout Orientation="Horizontal">
                            <Image Source="{Binding Logo}" IsVisible="true" WidthRequest="42" HeightRequest="42"/>
                             <Button Text="{Binding Name}" x:Name="BtnClub" AbsoluteLayout.LayoutBounds="100, 25, 100, 25" Clicked="OnListClubsClicked" TextColor="Black" VerticalOptions="FillAndExpand"/>
                        </StackLayout>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

这是 Json 网络服务的链接:

http://172.20.129.193/nypstudentlifeservice/api/club/list?categoryid=2

[{"Id":21,"CategoryId":2,"Name":"Chinese Cultural Group","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/CCG2.png"},{"Id":22,"CategoryId":2,"Name":"Chinese Orchestra","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/CO-ICON.png"},{"Id":23,"CategoryId":2,"Name":"Dance Company","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/DC2.png"},{"Id":24,"CategoryId":2,"Name":"Danz Inc.","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/DI-ICON.png"},{"Id":25,"CategoryId":2,"Name":"Der Treff German Club","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/DTG-ICON.png"},{"Id":26,"CategoryId":2,"Name":"Foreign Bodies Dance Group","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/FB-ICON.png"}]

【问题讨论】:

  • 有什么问题?
  • 我想在按钮名称和图像徽标上的列表视图中显示源的值,因为我绑定了图像源和名称。但是似乎没有显示任何结果。

标签: c# json xaml xamarin.forms


【解决方案1】:

您还没有真正说明问题是什么或您的问题是什么,但这里有一些基于您提供的代码的观察结果。

您在代码中混合了异步和同步调用。不要在异步方法中使用 .Result.Wait

从您尝试将响应读取为字符串的行中删除 .Result 并删除结果 await,就像您对 HTTP 请求所做的那样。

还注意到您没有为您的请求正确构建 Uri。您使用基地址创建了一个 Uri,但未包含提供的 url 参数。

public async Task<string> GetRequest(string url) {
    Uri getUri = new Uri("http://172.20.129.193/nypstudentlifeservice/" + url);
    HttpClient client = new HttpClient();
    HttpResponseMessage responseGet = await client.GetAsync(getUri);
    responseGet.EnsureSuccessStatusCode(); // Throw if not a success code.
    string content = await responseGet.Content.ReadAsStringAsync();
    return content;
}

public async Task<IEnumerable<CsClubList>> getClubList() {
    string json = await GetRequest("api/club/list?categoryid=2");

    List<CsClubList> clublist = JsonConvert.DeserializeObject<List<CsClubList>>(json);

    return clublist;
}

您还应该尽可能在 void 方法上使用异步,除非它们是事件处理程序。

因此,如果可能,您需要更改此设置

//NO NO NO NO NO
private async void setClubs(ListView listview)
{
    ClubApiClient service = new ClubApiClient();
    var clublist = await service.getClubList();
    listview.ItemsSource = clublist.ToList();
}

到这里

private async Task setClubs(ListView listview)
{
    ClubApiClient service = new ClubApiClient();
    var clublist = await service.getClubList();
    listview.ItemsSource = clublist.ToList();
}

【讨论】:

  • 您好,感谢您的回复!但是,在我的 xaml 页面上将值显示到图像和按钮上时,我仍然面临一些问题。
  • 好吧,鉴于您没有在问题中说明任何内容,我无法知道那是您的问题。使用适当的详细信息编辑您的问题,以便社区可以为您提供更好的答案。
  • 您好,我很抱歉刚才没有说明。我刚刚更新了问题。
  • 您还没有提出问题。您刚刚提供了代码并将其留给社区来猜测问题所在。清楚地说明问题是什么以及到目前为止您已尝试解决的问题。
  • 您好,谢谢您的提及,我刚刚更新了我的问题,希望它就足够了。
猜你喜欢
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2016-09-28
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多