Meddelande

Minska
No announcement yet.

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

Minska
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

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

    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:
    Kod:
    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:
    Kod:
    @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:
    Kod:
    @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:
    Kod:
    @{
    
                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?

  • #2
    Det här verkar iaf. funka lite bättre i cshtml filen, ger inga fel:
    Kod:
    @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

    Kommentera


    • #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:
      Kod:
      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:
      Kod:
      @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
      Kod:
      @{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?

      Kommentera


      • #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:
        Kod:
        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?
        Last edited by RolandT; 2011-10-12, 14:41.

        Kommentera


        • #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

          Kommentera


          • #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.

            Kommentera


            • #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?

              Kommentera


              • #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 )

                Kommentera


                • #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.

                  Kommentera

                  Working...
                  X