Хорошо, чтобы быть конкретным в вашем случае, первая проблема заключается в том, как вы определили конфигурацию вашего маршрута:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Вы можете сделать любую из этих двух вещей:
1) Измените имя вашего параметра в ActionResult, если вы используете конфигурацию маршрута по умолчанию:
[HttpGet]
[AllowAnonymous]
public ActionResult Article(int id)
{
using (MatrodyEntities db = new MatrodyEntities())
{
db.NewsData.Find(ArtID);
return View("Article", id);
}
}
2) Добавить новый маршрут к статье:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Add your route here
routes.MapRoute(
"GetArticle",
"Article/{ArtID}",
new { controller = "Article", action = "Article" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
Как только вы выполните один из этих двух методов, вы получите ошибку System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Int32', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[ElMatrodySite.Models.NewsData]
.
Эта ошибка в основном означает, что вы возвращаете неверную модель в свой View. В вашем случае ваш View ожидает модель типа: IEnumerable<ElMatrodySite.Models.NewsData>
, но вы возвращаете обратно return View("Article", ArtID);
, что неверно, и, следовательно, вы видите эту ошибку.
Чтобы решить эту проблему, вам необходимо отправить модель типа, ожидаемого вашим представлением. В вашем случае это List<NewsData>
.
Наконец, вы спросили, как использовать FirstOrDefault()
в вашем случае. Вы используете FirstOrDefault()
, когда не уверены, будут ли указанные критерии возвращать запись или нет из вашей Коллекции. Теперь я не совсем уверен, что у меня есть полный код для вашего метода ActionResult, но вы можете добавить FirstOrDefault()
следующим образом:
public ActionResult Article(int id)
{
List<NewsData> oneList = new List<NewsData>();
var data = new NewsData();
//Return the first element that matches the specified criteria or null if nothing is found
data=db.NewsData.Where(xx => xx.ArticleID == data.ArticleID).FirstOrDefault();
data.ArticleID = id;
return View(from NewsData in db.NewsData.ToList() select NewsData);
}
На основании ваших критериев вы можете выполнить дополнительную проверку ошибок. Если вы хотите обработать случай, когда никакое значение не возвращается из FirstOrDefault
, вы можете проверить его следующим образом:
if(data== null)
{
do something
}