Avatar billede simsen Mester
21. februar 2012 - 15:11 Der er 9 kommentarer og
1 løsning

MVC newbee spørgsmål

Hej,

Jeg er lige begyndt at se på MVC og dertil har jeg et spørgsmål.

Jeg har følgende:

Controllers:
namespace DisplayCustomer.Controllers
{
    public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ViewResult Index()
        {
            Customer objCustomer = new Customer();
            objCustomer.Id = 12;
            objCustomer.Code = "1001";
            objCustomer.Amount = 90.34;

            return View("DisplayCustomer", objCustomer);
        }

    }
}

Views:
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>ViewPage1</title>
</head>
<body>
    <div>
        The customer id is <%= Model.Id %> <br />

        The customer Code is <%= Model.Code %> <br />

        <% if (Model.Amount > 100) {%>
        This is a priveleged customer
        <% } else{ %>
        This is a normal customer
        <%} %>

    </div>
</body>
</html>

Models:
namespace DisplayCustomer.Models
{
    public class Customer
    {
        private string _Code;
        private string _Name;
        private double _Amount;
        private int _Id;

        public int Id
        {
            set
            {
                _Id = value;
            }
            get
            {
                return _Id;
            }
        }

        public string Code
        {
            set
            {
                _Code = value;
            }
            get
            {
                return _Code;
            }
        }

        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }

        public double Amount
        {
            set
            {
                _Amount = value;
            }
            get
            {
                return _Amount;
            }
        }
    }
}

Altså rigtig simpelt indtil nu.

Mit problem, når jeg forsøger at køre siden, får jeg at vide, at siden ikke eksister.

Jeg har så forsøgt mig med:
1) At højreklikke på ViewCustomer.aspx og sætte den til Start Page uden virkning.
2) http://localhost:50537/ViewCustomer
3) http://localhost:50537/DisplayCustomer
4) http://localhost:50537/DisplayCustomer/ViewCustomer
5) http://localhost:50537/DisplayCustomer/ViewCustomer.aspx
og og og

Men hver gang får jeg at vide, at siden ikke eksisterer. Hvad skal jeg gøre i projektet, så jeg kan se siden, når jeg trykker Ctrl+F5?
Avatar billede Syska Mester
21. februar 2012 - 15:27 #1
Din URL er:
http://sitename/Controller/View

Dvs ... sitename er ja, localhost:50537 i dette tilfælde.

Per convension fjernes Controller delen fra dit klasse navn.

Dvs:
CustomerController => Customer
View => DisplayCustomer

Dvs ... din url bliver: http://localhost:50537/Customer/DisplayCustomer

Du kan kigge i Globals.asax for hvordan default route conventions er sat op og eventuelt lave dine egne.

Der er en masse video og andet omkring MVC her. Det er en god ide at have styr på da der er mange ting som bare "magisk" sker ... og hvis man ikke ved hvorfor det kan lade sig gøre, og hvordan man kan ændre det, så er MVC ikke sjov at lege med.

mvh
Avatar billede simsen Mester
21. februar 2012 - 15:34 #2
Hej buzzzz,

Jeg tager den netop stille og roligt og forsøger mig frem - for at finde ud af hvad hulen der er op og ned i MVC. Og du kender mig jo så efterhånden - så når noget ikke går som jeg forventer, så spørger jeg herinde :-)

Når jeg forsøger mig med:

http://localhost:50537/Customer/DisplayCustomer

får jeg stadig en "The ressource cannot be found" fejl?

Min Global.asax ser sådan ud:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

        }

Har det noget at gøre med at den i action skriver Index og jeg ingen index.aspx har sat i det her projekt?
Avatar billede Syska Mester
21. februar 2012 - 16:00 #3
Burde det ikke have, da du explicit siger du vil bruge "DisplayCustomer" som view.

Jeg antager derfor at du har et View der hedder "DisplayCustomer.cshtml" under
"/Views/ControllerNavn/viewnavn.cshtml"

Dvs:

Din CustomerController med view DisplayCustomer
vil kigge i:
/Views/Customer/DisplayCustomer.aspx efter et view den vil bruge.

Der er dog flere steder den kigger.

Jeg jeg er ikke sikker på at dit "View" er valid ...
Avatar billede Syska Mester
21. februar 2012 - 16:00 #4
Det burde mere se noget ud ala:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title>ViewPage1</title>
</head>
<body>
    <div>
       
    </div>
</body>
</html>
Avatar billede softspot Forsker
21. februar 2012 - 17:19 #5
Din url er umiddelbart:

localhost:50537/Customer

da index er default behøver du ikke angive den i url'en. På den anden side skader det heller ikke at gøre det, altså:

localhost:50537/Customer/Index

Det er nemlig funktionen i controller-klassen der angiver navnet på din action og ikke det view du kalder.
Avatar billede Syska Mester
21. februar 2012 - 17:46 #6
Dohhh softspot, du har helt ret, godt set.

Sådan er det når man sidder og sover på arbejdet :-)

Man bør heller ikke efter min mening override conventions.

Index action => Index view

Index action => DisplayCustomer view ... det kan være træls at debug, men der findes da steder hvor det kan give mening at gøre.

mvh
Avatar billede simsen Mester
22. februar 2012 - 08:13 #7
Jeg skal have alting ind med skeer :-)

I den tutorial jeg følger, skrev han, at jeg skulle højreklikke på Views og her vælge Add/View. Jeg tilføjede nu et view, jeg kaldte ViewCustomer.aspx

Den kom så til at ligge i mappen således:
Views
...Shared (mappe)
...ViewCustomer.aspx

Denne kunne jeg ikke få fat i. Hvis jeg så i stedet gik ind i CustomerController.cs og højreklikkede på ViewResult og valgte Add View... Så lavede den en mappe under Views nemlig kaldet Customer.

Nu kan jeg se siden ved at klikke:
http://localhost:50537/customer

Så nu har jeg da bestemt nogle spørgsmål :-)

Jeg er mappe hysterisk. Altså dermed sagt, jeg kan enormt godt lide at alting er ordnet i kategorier. Det vil sige, har jeg et emne (Customer) vil jeg da frygtelig gerne kunne lægge ALT ind under Customer mappen (selvfølgelig hvis det passer til sidens struktur)...

Kan jeg slet ikke bestemme en mappe kategori under Views og så selv bestemme, at forskellige Controllers skal lægge der? Hvis såfremt ja - hvad skal stien så være til ViewCustomer.aspx i browseren?

Altså i Views kunne jeg måske forestille mig følgende struktur:
Views
...Customers
......ViewCustomer.aspx
......SetCustomer.aspx
...Cars
......ViewCars.aspx
......SetCars.aspx

Bare for at tage et eksempel (I Controllers vil jeg have samme struktur).

------
Buzzzz
Jeg har intet der hedder .cshtml under Views - jeg har kun (såvidt jeg kan se) .aspx sider) - er cshtml noget den selv skulle generere?

softspot
Kan du foreklare mig hvad du mener med:
"Det er nemlig funktionen i controller-klassen der angiver navnet på din action og ikke det view du kalder."

Funktionen er det ViewResult?

Og til sidst, har I et link, der kan give mig en forklaring (der siger det med skeer) mht. strukturen. For lige nu (og ja, jeg ER lige startet på den her del), så sidder jeg med en følelse af at i Controllers ligger funktionerne, men også at til hver Controller (funktion) skal jeg oprette hver sin side (Views) - og det skærer da i mine øjne, hvis såfremt....Det nægter jeg at tro, er rigtig forstået :-)
Avatar billede Syska Mester
22. februar 2012 - 09:19 #8
Hej,

MVC er convention over configuration. Følg MS conventioner.

Customers og Cars er din (Cars/Customers)Controller.

Under der ligger dine Views.

"Shared" mappen kan ses af alle Controllers og er dermed delte Views som kan bruges af alle Controllers.

Grunden til du kun har aspx er fordi du bruger WebFormViewEngine. Her er en liste over de forskellige. Folk bruger i dag for det meste Razor. Du kan se en liste over dem her: http://stackoverflow.com/questions/1451319/asp-net-mvc-view-engine-comparison

En "Index" method, også kaldet din Action, vil per convention hente et View med samme navn, altså Index.aspx.

Det har du så overridded ved at angive et navn som første parameter til din
return View("alternativeViewNavn", model);

Ja ... asp.net/mvc ... der bliver det forklaret med skeer, mht views, routes, controllers ...

Her er 6 timers video omkring MVC ... GOGOGOGO:
http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=aspdotnet-mvc3-intro

mvh
Avatar billede simsen Mester
22. februar 2012 - 10:08 #9
Ja, jeg tror jeg har forstået at jeg har set Controllers forkert. Jeg troede det var et sted til at indsætte kode, som så kunne bruges i alle Views....Men skal mere se det et sted, hvor den samler koden for de enkelte views i stedet.

Men jeg bliver nok rigtig meget klogere, når jeg har set 6 timers video igennem. Rigtig mange tak for linket :-)

Og jeg vender helt sikkert frygtelig tilbage ;-)
Avatar billede Syska Mester
22. februar 2012 - 10:17 #10
No problem. MVC er dejligt når man fårstår hvordan det hele er opbygget.

mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester