2013-08-05 2 views
0

У меня есть страница финалиста, которая отображает список финалистов, которые можно щелкнуть на странице с одним просмотром. У меня есть XML-документ, который передается в модель, и я проливаю эти данные на главную страницу финалистов, но я не могу понять, как захватить идентификатор финалиста щелчка и отобразить только этого финалиста на странице с одним просмотром.Возврат одного элемента в модели - mvc razor

Любой помощь ценятся, вот мой контроллер прямо сейчас:

Я пытаюсь передать вновь созданную модель в класс к 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); 
     } 

    } 
} 

ответ

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

Затем в финалисты-странице, вы можете просто испускать а-тегов, как это:

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

EDIT Добавление простой метод кэширования, так что 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"]; 
} 
+0

Любой способ сделать, чтобы это без того, чтобы передать XML-документ в качестве модели, которую я уже делал в Ind экс-Action? Я пытаюсь не повторять код. –

+0

Вы можете кэшировать XML-документ или даже проанализированный список. – Kenneth

+0

FWIW, никогда не делайте жестких кодовых URL-адресов. Используйте 'Html.ActionLink (« SingleView »,« YourController », новый {id = finalist.id})'. Если вы обновите, я буду поддерживать, но я не могу рекомендовать ответ в его нынешнем виде. –