webForumDet fria alternativet

Nybörjare i ASP.net och MVC 3 (partial views fråga)

.NET

8 svar · 1 517 visningar · startad av RolandT

Medlem sedan okt. 201124 inlägg
Frågan#1

OK, jag är ny på det här och min erfarenhet ligger med klassisk ASP, vilket är last gammalt så jag tänkte börja med MVC istället men jisses det är inte lätt.

Har kompleterat tutorialien på asp.net där man gjorde en video-databas. Jag tänkte göra ett system för avvikelser så jag ändrade om koden och gjorde en huvudtabell och tre andra små tabeller (plats, typ, orsak). Spenderade hela gårdagen att få en view att visa en enkel drop down lista som hämtas från databasen.

Såhär ser den koden ut i controllern:


public ActionResult Create()
        {
            var db = new AvvikelserDBContext();
            //Skapa lista för Typer
            var typQuery = db.Typer.Select(c => new { c.ID, c.Typ });
            ViewBag.TypCategoryId = new SelectList(typQuery.AsEnumerable(), "ID", "Typ");

            //Skapa lista för Orsaker
            var orsakQuery = db.Orsaker.Select(c => new { c.ID, c.Orsak });
            ViewBag.OrsakCategoryId = new SelectList(orsakQuery.AsEnumerable(), "ID", "Orsak");

            //Skapa lista för Platser
            var platsQuery = db.Platser.Select(c => new { c.ID, c.Plats });
            ViewBag.PlatsCategoryId = new SelectList(platsQuery.AsEnumerable(), "ID", "Plats");

            return View();
        }

Sen i view blir det t.ex. såhär:

@Html.DropDownList("Plats", (SelectList) ViewBag.PlatsCategoryId, "--Select One--")

OK det funkar för den där view:n men inga andra views, om jag vill det så måste jag duplicera koden för varje view i controllern.... Det måste ju finnas någon metod för att kunna skapa en funktion som man kan anropa lite varsomhelst ifrån och jag hittade något som heter partial views.

Kollade på några exempel och försökte göra en egen version av detta, skapade en partial view som heter DisplayList.cshtml och i den satte jag:

@Html.DropDownList("Plats", (SelectList) ViewBag.PlatsCategoryId, "--Select One--")

Då funkar det att anropa det från create view:n men ingen annan, så det är ju inte bättre alls. Jag försökte slänga in databaskoden i DisplayList och göra det lite mera självständigt men det bara krashar hela tiden, den här koden funkade inte alls:

@{

            var db = new AvvikelserDBContext();
            //Skapa lista för Typer
            var typQuery = db.Typer.Select(c => new { c.ID, c.Typ });
            ViewBag.TypCategoryId = new SelectList(typQuery.AsEnumerable(), "ID", "Typ");

            //Skapa lista för Orsaker
            var orsakQuery = db.Orsaker.Select(c => new { c.ID, c.Orsak });
            ViewBag.OrsakCategoryId = new SelectList(orsakQuery.AsEnumerable(), "ID", "Orsak");

            //Skapa lista för Platser
            var platsQuery = db.Platser.Select(c => new { c.ID, c.Plats });
            ViewBag.PlatsCategoryId = new SelectList(platsQuery.AsEnumerable(), "ID", "Plats");
        }

@Html.DropDownList("Typ", (SelectList) ViewBag.TypCategoryId, "--Select One--")

Så... hur ska jag egentligen göra om jag villa anropa en funktion som hämtar en lista ur en tabell, från vilken sida som helst i applikationen?

Medlem sedan okt. 201124 inlägg
#2

Det här verkar iaf. funka lite bättre i cshtml filen, ger inga fel:

@using mvcAvvikelser.Models;
@{
		var db = new AvvikelserDBContext();
		//Skapa lista för Typer
		var typQuery = db.Typer.Select(c => new { c.ID, c.Typ });
		ViewBag.TypCategoryId = new SelectList(typQuery.AsEnumerable(), "ID", "Typ");

		//Skapa lista för Orsaker
		var orsakQuery = db.Orsaker.Select(c => new { c.ID, c.Orsak });
		ViewBag.OrsakCategoryId = new SelectList(orsakQuery.AsEnumerable(), "ID", "Orsak");

		//Skapa lista för Platser
		var platsQuery = db.Platser.Select(c => new { c.ID, c.Plats });
		ViewBag.PlatsCategoryId = new SelectList(platsQuery.AsEnumerable(), "ID", "Plats");
	}

Har dock ingen aning om detta är rätt sätt och jag vet inte hur jag ska få detta att ge en ordentlig output i view:n

Medlem sedan okt. 201124 inlägg
#3

Försökte tänka om lite och det är ju så att all kod ska ligga i kontrollern så jag gick till den och skapade följande, förenklade version:

public ActionResult _DropDownList()
        {
            var db = new AvvikelserDBContext();
            //Skapa lista för Typer
            var typQuery = db.Typer.Select(c => new { c.ID, c.Typ });
            ViewBag.TypCategoryId = new SelectList(typQuery.AsEnumerable(), "ID", "Typ");

            return View();
        }

Sen en ny partial view för denna kodsnutt som jag kallade "_DropDownList.cshtml", vilken består av:

@model mvcAvvikelser.Models.Avvikelser
@Html.DropDownList("Typ", (SelectList) ViewBag.TypCategoryId, "--Select One--")

Tyckte jag verkade mera i linje med hur man ska tänka i MVC, sen försökte jag anropa denna view från en annan med koden

@{Html.RenderPartial("_DropDownList");}

Det klagar dock och tar mig till VS som säger "There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Typ'."

Och jag förstår inte varför, allt verkar korrekt länkat såsom jag förstått det?

Medlem sedan okt. 201124 inlägg
#4

Om jag använder RenderAction istället för RenderPartial så funkar det, fast då tar det med hela jäkla sidan med layout och allt.

Varför funkar RenderAction men inte RenderPartial, vad är skillnaden?
Och hur kommer jag undan att layouten återanvänds, vill endast att själva list-elementet ska visas.
----

Jag löste nu problemet med layouten genom att ange följande i viewern: "@{ Layout = "";}"

Nu skulle det vara intressant att veta om man kan modifiera koden här:

var db = new AvvikelserDBContext();
            //Skapa lista för Typer
            var typQuery = db.Typer.Select(c => new { c.ID, c.Typ });
            ViewBag.TypCategoryId = new SelectList(typQuery.AsEnumerable(), "ID", "Typ");

Så att man kan göra tabellnamnet dynamiskt, så man kunde använda samma kodsnutt för att ta ut 3 olika listor?

Medlem sedan juli 2003555 inlägg
#5

RenderAction är rätt, då "kör" du controllern, som i sin tur väljer en lämplig vy, samt ger vyn lämplig data. Däremot, om du kör RenderView så "är" du controllern, och du själv väljer vy, samt ger den lämplig data.

Att RenderView då inte fungerar är inte så konstigt - du skickar aldrig med den data som vyn vill ha.

RenderAction är då troligtvis det rätta i det här fallet

Medlem sedan okt. 201124 inlägg
#6

Tack för förklaringen, såndär info är guld värd. Jag har läst det kan finnas ett sätt till och det är att använda "helpers" som man lägger i mappen app_code, men det fick jag aldrig riktigt att funka heller. Förmodligen något uppenbart jag missat.

Medlem sedan okt. 201124 inlägg
#7

Jag tror jag kommer att behöva en C# bok här, någon som har något att rekommendera? Finns det allmänna c# böcker eller MVC 3 inriktade böcker? Vad kunde jag ha större nytta av?

Medlem sedan juli 2003555 inlägg
#8

Har ingen koll på böcker, har inte läst någon bok om programmering på hur många år som helst :) (Läste lite i början på min "karriär", men det var tiden innan jag hade tillgång till internet.)

Jag skulle rekommendera dig att googla alla dina problem istället :) (Sen vill jag för övrigt tipsa om stackoverflow.com, finns en stor bank med besvarade frågor där redan, och om det behövs så kan du ju alltid skriva en egen fråga :) )

Medlem sedan okt. 201124 inlägg
#9

Tja, det känns som jag skulle behöva en grundkurs i koncepten för 99% av vad jag läser så förstår jag inte.

359 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
232 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)