0

我有一个决赛入围者页面,其中显示了入围者列表,可点击进入单视图页面。我将 XML 文档传递到模型中,并将该数据溢出到主决赛选手页面,但我似乎无法弄清楚如何获取点击的决赛选手的 id 并在单视图页面上仅显示该决赛选手。

任何帮助表示赞赏,这是我现在的控制器:

我正在尝试将新创建的模型传递给 singleView 类,但我不确定如何过滤它以了解单击了哪个决赛选手,以及在单视图页面上显示哪个决赛选手。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;
using ProjectX_Awards.Models;

namespace ProjectX_Awards.Controllers
{
    public class FinalistsController : Controller
    {
        //
        // GET: /Finalists/

        public ActionResult Index()
        {
            var doc = XElement.Load(HttpContext.Server.MapPath("~/finalist.xml"));
            var finalists = doc.Descendants("finalist").Select(f => new Models.Finalist()
                {
                    Id = (int)f.Attribute("id"),
                    Name = f.Descendants("name").First().Value,
                    Description = f.Descendants("description").First().Value,
                    Link = f.Descendants("webLink").First().Value,
                    Photo = f.Descendants("photoUrl").First().Value
                });

            return View(finalists);
        }

        public ActionResult SingleView(Finalist model)
        {
            var singleFinalist = model;

            return View(singleFinalist);
        }

    }
} 
4

1 回答 1

1

如果您想传递一个完整的模型,您需要对该操作方法进行 POST。最简单的方法是确保将表单元素中的所有值发布到指定的操作。但是,最好的办法是将 Id 传递给您的 SingleView 方法。这使您可以访问该页面,而不必发布完整的对象:

public ActionResult SingleView(int id)
{
    var singleFinalist = model;
    var doc = XElement.Load(HttpContext.Server.MapPath("~/finalist.xml"));
    var finalist = doc.Descendants("finalist").Where(f => (int)f.Attribute("id") == id)
                                              .Select(f => new Models.Finalist()
    {
        Id = (int)f.Attribute("id"),
        Name = f.Descendants("name").First().Value,
        Description = f.Descendants("description").First().Value,
        Link = f.Descendants("webLink").First().Value,
        Photo = f.Descendants("photoUrl").First().Value
    })
    .FirstOrDefault;

    return View(finalist);
}

然后在您的决赛入围者页面中,您可以发出一个像这样的 a-tag:

@foreach(var finalist in Model)
{
    <a href="/yourController/SingleView/@finalist.id">Detail</a>
    // or
    @Html.ActionLink("SingleView", "YourController", new { id = finalist.id })
}

编辑添加一个简单的缓存方法,因此每次都不会重新加载 XML:

public ActionResult Index()
{
    return View(GetAllFinalists());
}

public ActionResult SingleView(int id)
{
    var doc = XElement.Load(HttpContext.Server.MapPath("~/finalist.xml"));
    var finalist = GetAllFinalists().Where(f => f.Id == id)
                                    .FirstOrDefault;
    return View(finalist);
}

private IEnumerable<Models.Finalist> GetAllFinalists()
{
    if (HttpContext.Current.Application["finalists"] == null)
    {
        var doc = XElement.Load(HttpContext.Server.MapPath("~/finalist.xml"));
        HttpContext.Current.Application["finalists"] = doc.Descendants("finalist")
            .Select(f => new Models.Finalist()
                {
                    Id = (int)f.Attribute("id"),
                    Name = f.Descendants("name").First().Value,
                    Description = f.Descendants("description").First().Value,
                    Link = f.Descendants("webLink").First().Value,
                    Photo = f.Descendants("photoUrl").First().Value
                });
    }
    return (IEnumerable<Models.Finalist>)HttpContext.Current.Application["finalists"];
}
于 2013-08-05T15:37:44.217 回答