poti sa tii o imagine default in rootul aplicatiei, in cazul in care geturile pentru cele bune nu vin cu status 200.
Salut! Revin cu o noua problema, de azi dimineata nu ii dau de cap.
Am o pagina in care imi arata toate anunturile, dar si o bara de cautare. Problema este ca atunci cand incerc sa caut ceva imi da o eroare. O sa va prezint mai multe detalii:
Aici e partea din Controller:
public ActionResult ViewAds(string searchString, int? page)
{
ViewBag.Message = "Lista tuturor anunturilor";
List<AdViewModel> ads = new List<AdViewModel>();
List<AdViewModel> data = new List<AdViewModel>();
if(!string.IsNullOrEmpty(searchString))
{
data = SearchByFilters(searchString);
}
else
{
data = LoadAd();
}
int pageSize = 3;
int pageNumber = (page ?? 1);
foreach (var row in data)
{
List<string> imgData = LoadImageUrl(row.Id);
ads.Add(new AdViewModel
{
Id = row.Id,
Title = row.Title,
Description = row.Description,
PublishDate = row.PublishDate,
Location = row.Location,
Status = row.Status,
PhotoUrl = imgData
});
}
@ViewBag.nrRez = ads.Count();
return View(ads.ToPagedList(pageNumber, pageSize));
}
Aici am partea de View:
@using (Html.BeginForm("ViewAds", "Ad", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString")
<input type="submit" value="Search" />
</p>
}
@foreach (var item in Model)
{
<div class="col-lg-4 col-sm-6 mb-30">
<div class="product-card mx-auto mb-3">
<div class="product-card-body">
<h5 class="product-title">@Html.ActionLink(@Html.DisplayFor(modelItem => item.Title).ToString(), "ViewAdDetails", "Ad", new { id = @Html.DisplayFor(modelItem => item.Id) }, null)</h5>
@*<h5 class="product-title"><a href="@Url.Action("ViewAdDetails", "Ad", new { id = @Html.DisplayFor(modelItem => item.Id) }) ">@Html.DisplayFor(modelItem => item.Title)</a></h5>*@
</div>
<a class="product-thumb" href="@Url.Action("ViewAdDetails", "Ad", new { id = @Html.DisplayFor(modelItem => item.Id) })">
<img src="@Html.DisplayFor(modelItem => item.PhotoUrl[0])" alt="Product Thumbnail" class="cover-img">
</a>
<div style="text-align:center;">
<span class="product-price">
<i class="fas fa-map-marker-alt"></i>
@Html.DisplayFor(modelItem => item.Location)
</span>
<span class="product-meta"><i class="far fa-calendar-alt"></i> @Html.DisplayFor(modelItem => item.PublishDate)</span>
</div>
<div class="product-buttons-wrap">
<div class="product-buttons">
<div class="product-button"><a href="#"><i class="fa fa-heart"></i></a></div>
<div class="product-button"><a href="#"><i class="fas fa-share-alt-square"></i></a></div>
</div>
</div>
</div>
</div>
}
Daca in caseta de search nu introduc un text in urma caruia nu gaseste nici un rezultat imi va afisa corect ca nu s-a gasit nimic. In schimb, daca introduc ceva si imi gaseste rezultate imi da o eroare, cum ca index-ul de la foreach este out of range.
Am incercat sa fac in loc de foreach un for, cu i e la 0 la @ViewBag.nrRez pe care il primesc din controller dar primesc aceiasi eroare. Are cineva vreo idee de la ce poate fi ?
salut,vezi daca te ajuta: Razor generates Index out of Range error | The ASP.NET Forums
Nu ma prea ajuta. Daca de exemplu dau search pentru cuvantul “caine” vor fi gasite 2 anunturi corespunatoare. Daca le afisez ‘manual’ in view, fara for, adica Model[0] si Model[1] functioneaza corect. Nu inteleg de ce imi da eroarea aia cu index, teoretic merge doar pana unde trebuie.
PhotoUrl este de tip List si in view accesezi mereu primul item item.PhotoUrl[0]
care ar trebui sa si existe
nu folosesc Asp,dar cred ca ai putea depana putin codul,de exemplu comenteaza partea de markup din foreach si pune un simplu text sa verifici daca problema e chiar foreachul.eventual o conditie inainte de el,sa-l executi doar cand ai Model != null && Model.SomeList.Count()>0
pana iti vin datele de pe server cum este initializat acel Model?
mai trebuie vazut si ce tip de date rezulta din ads.ToPagedList(pageNumber, pageSize),ar trebui sa fie tot de tip AdViewModel
mai sus spui ca iti da eroare daca folosesti un for, cu i de la 0 la @ViewBag.nrRez,din ce vad in controller nrRez va contine numarul total de inregistrari din ads,inainte de a le pagina/filtra,adica daca ai 20 de inregistrari cu 10/pagina nrRez va fi 20 iar in Model ai 10(cat pt o pagina) si de aici posibil eroare de index
Am gasit problema… era o gresela la sql, nu selectam si id-ul anuntului in metoda SearchByFilters(searchString) , deci el la view cand trebuia sa selecteze anuntul dupa id, id-ul era 0. Nu imi vine sa cred cate ore bune am pierdut cautand problema…
Multumesc mult pentru raspunsuri!
Probleme de genul acesta vor aparea pana te obisnuiesti sa faci debug.
Uita-te la cateva tutoriale de debugging in VS (cum pui breakpoints, cum le muti, cum te uiti la variabile, cum le modifici, breakpoint-uri conditionale, debug in View-uri, etc.) si iti va fi mult mai usor sa gasesti rezolvarea la probleme asemanatoare.
Poti sa incepi cu articolul acesta.
Mai mult, invata sa folosesti DevTools-ul din Chrome (F12), in special tabul de Network ca sa intelegi ce primesti si ce trimiti catre server. In acest mod poti detecta foarte rapid problemele de Model Binding (cu care sigur te-ai lovit / te vei lovi).
Multumesc mult pentru raspun! O sa tin cont de sfat.
Salutare tuturor! Azi am implementat o noua functionalitate aplicatiei, si anume o sectiune de comentarii.
Am creat un model pentru CommentModel:
public class CommentModel
{
public int Id { get; set; }
public int AdId { get; set; }
public string User { get; set; }
public string UserComment { get; set; }
}
Pe partea de controller, pentru fiecare anunt incarc o lista de comentarii definita astfel:
public ActionResult ViewAdDetails(int id)
{
List<string> imgData = LoadImageUrl(id);
var data = LoadAd(id);
AdViewModel ad = new AdViewModel
{
Id = data[0].Id,
Title = data[0].Title,
Description = data[0].Description,
PublishDate = data[0].PublishDate,
Location = data[0].Location,
Status = data[0].Status,
PhotoUrl = imgData
};
List<CommentModel> comments = new List<CommentModel>();
var data2 = LoadComments(id);
if (data2.Count() > 0)
{
foreach (var comentariu in data2)
{
comments.Add(new CommentModel
{
Id = comentariu.Id,
AdId = comentariu.AdId,
User = comentariu.User,
UserComment = comentariu.UserComment
});
}
}
var tupleModel = new Tuple<AdViewModel, List<CommentModel>>(ad, comments);
ViewBag.CommCount = comments.Count();
ViewBag.Test = comments[0].UserComment;
return View(tupleModel);
}
Am facut verificari si obiectul ad contine informatiile corecte.
Metodele pentru incarcarea comentariilor sunt:
public static List<CommentModel> LoadComments(int id)
{
string sql = @"select comment_id, ad_id, email, comentariu from dbo.comments where(dbo.comments.ad_id = '" + @id + "')";
return SqlDataAccess.LoadData<CommentModel>(sql);
}
Iar
public static List<T> LoadData<T>(string sql)
{
using (IDbConnection cnn = new SqlConnection(GetConnectionString()))
{
return cnn.Query<T>(sql).ToList();
}
}
Problema este urmatoarea: eu o sa trimit spre view acel tupleModel care contine un obiect al clasei AdViewModel si o lista de tipul CommentModel.
Deci in partea de View as avea Model.Item1 care contine obiectul ad, iar Model.Item2 contine lista de comentarii.
Pentru afisarea informatiilor din Model.Item1 nu apar probleme, dar cand vreau sa afisez elementele din Model.Item2 nu le afiseaza.
Aici am codul din View:
@if (ViewBag.CommCount > 0)
{
<p> sunt comentarii:</p>
foreach (var com in Model.Item2)
{
@Html.DisplayFor(modelItem => com.UserComment)
@Html.DisplayFor(modelItem => com.User)
}
}
<p> numarul comentariilor este @ViewBag.CommCount</p>
<p> comentariu prin viewbag @ViewBag.Test</p>
ViewBag.CommCount contine numarul de comentarii incarcate. Precizez ca imi afiseaza corect, am testat pentru un anunt care are 2 comentarii si imi afiseaza 2. Problema este la ViewBag.Test. care in Controller are atribuita valoarea ViewBag.Test = comments[0].UserComment;, dar totusi nu imi returneaza comentariul.
Deci, lungimea listei de comentarii este corecta, dar continutul nu este corect.
Sper ca nu este de incurcat codul si se intelege cat de cat problema. As fi recunoscator daca cineva ma poate ajuta, nu am reusit sa gasesc inca solutia.
Multumesc!
Ce ai prin lista aia?
Pune un brakpoint si vezi daca ai ceva.
Aici eventual.
ViewBag.Test = comments[0].UserComment;
Imi da $exception
error CS0103: The name ‘$exception’ does not exist in the current context