Asp.net mvc 返回模型中的单个项目-mvc razor

Asp.net mvc 返回模型中的单个项目-mvc razor,asp.net-mvc,razor,asp.net-mvc-controller,Asp.net Mvc,Razor,Asp.net Mvc Controller,我有一个最终入围者页面,其中显示了最终入围者列表,可点击进入单个视图页面。我将XML文档传递到一个模型中,并将这些数据传递到主要的最终用户页面上,但我似乎不知道如何获取单击的最终用户id并在单个视图页面上仅显示最终用户 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Xml.Linq; using Proj

我有一个最终入围者页面,其中显示了最终入围者列表,可点击进入单个视图页面。我将XML文档传递到一个模型中,并将这些数据传递到主要的最终用户页面上,但我似乎不知道如何获取单击的最终用户id并在单个视图页面上仅显示最终用户

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);
        }

    }
} 
感谢您的帮助,这是我的控制器:

我试图将新创建的模型传递给singleView类,但我不确定如何对其进行过滤,以了解单击了哪个最终用户,以及要在single view页面上显示哪个最终用户

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);
        }

    }
} 

如果您想要传递一个完整的模型,您需要对该操作方法进行一次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标记,如下所示:

@foreach(var finalist in Model)
{
    <a href="/yourController/SingleView/@finalist.id">Detail</a>
    // or
    @Html.ActionLink("SingleView", "YourController", new { id = finalist.id })
}
@foreach(模型中的var最终确定者)
{
//或
@ActionLink(“SingleView”,“YourController”,新的{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"];
}
public ActionResult Index()
{
返回视图(GetAllFinalists());
}
公共操作结果单视图(int id)
{
var doc=XElement.Load(HttpContext.Server.MapPath(“~/finalist.xml”);
var finalist=getAllFinalits()。其中(f=>f.Id==Id)
.FirstOrDefault;
返回视图(入围者);
}
私有IEnumerable GetAllFinalists()
{
if(HttpContext.Current.Application[“finalists”]==null)
{
var doc=XElement.Load(HttpContext.Server.MapPath(“~/finalist.xml”);
HttpContext.Current.Application[“finalists”]=文档子体(“finalists”)
.Select(f=>newmodels.Finalist()
{
Id=(int)f.Attribute(“Id”),
Name=f.Name(“Name”).First()值,
Description=f.Description(“Description”).First()值,
Link=f.substands(“webLink”).First()值,
Photo=f.productions(“photoUrl”).First()值
});
}
返回(IEnumerable)HttpContext.Current.Application[“finalists”];
}

有什么方法可以做到这一点,而不必像我在索引操作中已经做的那样将XML文档作为模型传递?我尽量不重复代码。你可以缓存XML文档,甚至是解析后的list.FWIW,不要像那样硬编码URL。使用
Html.ActionLink(“SingleView”、“YourController”、新的{id=finalist.id})
。如果你更新,我会更新投票,但我不能推荐目前的答案。我硬编码了它,所以很明显这只是一个get请求,我添加了actionlink和缓存示例非常感谢!这是工作!我可能需要修改一点以包括类别,但我可以从这里开始。回答得很好,非常感谢!