使用Razor表单(Html.BeginForm())我在我的BooksController中调用一个动作,它向www.isbndb.com发出api调用以获取书籍信息。在序列化XML响应之后,我不确定如何将该数据传回去在调用视图中使用。
@using (Html.BeginForm("searchForISBN", "Books"))
{
@Html.TextBoxFor(m => m.Title)
<input class="btn " id="searchForISBN" type="submit" value="Search" />
}
<?xml version="1.0" encoding="UTF-8"?>
<ISBNdb server_time="2005-07-29T03:02:22">
<BookList total_results="1">
<BookData book_id="paul_laurence_dunbar" isbn="0766013502">
<Title>Paul Laurence Dunbar</Title>
<TitleLong>Paul Laurence Dunbar: portrait of a poet</TitleLong>
<AuthorsText>Catherine Reef</AuthorsText>
<PublisherText publisher_id="enslow_publishers">
Berkeley Heights, NJ: Enslow Publishers, c2000.</PublisherText>
<Summary> A biography of....</Summary>
<Notes>"Works by Paul Laurence Dunbar": p. 113-114.
Includes bibliographical references (p. 124) and index.</Notes>
<UrlsText></UrlsText>
<AwardsText></AwardsText>
</BookData>
</BookList>
</ISBNdb>
public StringBuilder searchForISBN(Books books)
{
HttpWebRequest request = WebRequest.Create("http://isbndb.com/api/books.xml?access_key=xxxxxx&index1=title&value1="+books.Title) as HttpWebRequest;
string result = null;
using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
StringBuilder output = new StringBuilder();
using (XmlReader reader = XmlReader.Create(new StringReader(result)))
{
reader.ReadToFollowing("BookList");
reader.MoveToFirstAttribute();
reader.MoveToNextAttribute();
reader.MoveToNextAttribute();
reader.MoveToNextAttribute();
string shown_results = reader.Value;
int numResults;
bool parsed = Int32.TryParse(shown_results, out numResults);
for (int i = 0; i < numResults; i++)
{
reader.ReadToFollowing("BookData");
reader.MoveToFirstAttribute();
reader.MoveToNextAttribute();
string isbn = reader.Value;
output.AppendLine("The isbn value: " + isbn);
}
}
return ouput;
}
我正在尝试将数据返回到调用视图,以在Create.cshtml中的搜索栏表单下方显示结果。目前它正在返回一个路径为localhost:xxxxx / Books / searchForISBN。
的新视图关于如何做到这一点的任何想法?
答案 0 :(得分:1)
XmlReader是一个低级API,用于性能关键代码,而且,正如您所推测的那样,它本身不会为您创建一个可以传递给视图的对象。
您可能需要考虑创建自己的强类型对象,该对象封装isbndb.com返回的所有信息。您还可以使用XmlDocument类,并使用XPath从中查询属性。
XmlDocument doc = new XmlDocument();
doc.Load(stream);
string xpath = "data/element[@id='paul_laurence_dunbar']/AuthorsText";
XmlNode node = doc.SelectSingleNode(xpath);
if (node != null) {
Console.WriteLine(node.InnerText);
}
HTH。 粘土
答案 1 :(得分:0)
您可以直接返回视图。像这样:
return View("CallingViewName",model);
您可能必须构建一个您希望传递回视图的序列化XML书籍信息的模型。