Cum să apelați o metodă/funcție dintr-un alt fișier de clasă (Programare, C#, Asp.Net Mvc 3)

Dennis a intrebat.

Am încercat să fac această funcție (și altele) și să o pun într-un fișier de clasă separat în proiectul meu care se află sub „/Helpers/UploadFiles.cs”

namespace Artikelhantering.Helpers
{
public class UploadFiles
{

    private void EnsureDirectoriesExist(string SKU)
    {

        // if the directory doesn't exist - create it. 
        if (!System.IO.Directory.Exists("//servername/wwwroot/prodimg/" + SKU))
        {
            System.IO.Directory.CreateDirectory("//servername/wwwroot/prodimg/" + SKU);
        }

    }
}

Apoi, în controller am adăugat using Artikelhantering.Helpers;, , este adăugat și în secțiunea namespace din fișierul web.config și, de asemenea, în global.asa.cx.

Apoi m-am gândit că aș putea să o apelez de la un ActionResult în controlerul meu, astfel

[ChildActionOnly]
public ActionResult _EnumerateFolder(string SKU)
        {
            // create directory if it does not exist
            EnsureDirectoriesExist(SKU);

            ViewBag.SKU = SKU;
            var folder = Directory.EnumerateFiles("//servername/wwwroot/prodimg/" + SKU);
            return View(folder);
        }

Dar tot ce obțin este:

Eroare 2 Numele „EnsureDirectoriesExist” nu există în contextul curent.

Am încercat să o sun scriind ca UploadFiles.EnsureDirectoriesExist(); dar nici asta nu funcționează. Cum ar trebui să apelez aceste metode fără să le am pe toate în același fișier? Aș dori să organizez mai bine acest lucru.

Comentarii

  • EnsureDirectoriesExist este privată, această metodă trebuie să fie publică –  > Por M.Azad.
5 răspunsuri
Thorsten Dittmar

Metoda este privată. Nu puteți accesa membrii privați ai altor clase.

De asemenea, mai sunt și alte probleme aici:

  1. Metoda pe care ați scris-o este o metodă de instanță, deci trebuie să aveți o instanță a clasei pentru a apela metoda.
  2. Dacă doriți să o apelați folosind UploadFiles.EnsureDirectoryExists(), , trebuie să o faceți o metodă de clasă (static).
  3. Nu sunt sigur că puteți crea un nou director în modul în care încercați să o faceți. Dacă încercați să creați directorul pe aceeași mașină pe care rulează acest cod, utilizați nume de fișiere locale.

Exemplu de cod pentru 1):

UploadFiles uf = new UploadFiles();
uf.EnsureDirectoryExists();

Exemplu de cod pentru 2):

public class UploadFiles
{
    public static void EnsureDirectoriesExist(string SKU)
    {
        // if the directory doesn't exist - create it. 
        if (!System.IO.Directory.Exists("//servername/wwwroot/prodimg/" + SKU))
        {
            System.IO.Directory.CreateDirectory("//servername/wwwroot/prodimg/" + SKU);
        }
    }
}

În plus, vă sugerez să căutați pe Google un tutorial C# care să vă ofere informații despre ce sunt clasele și cum pot fi folosite.

Comentarii

  • Da, era privat în codul pe care l-am postat din greșeală, acum îl am ca public, am testat lucruri la întâmplare să văd ce funcționează. Am făcut modificările pe care le-ai spus și pare să funcționeze acum, mulțumesc! În ceea ce privește 3 am verificat cu un alt cod de upload că într-adevăr funcționează. –  > Por Dennis.
  • OK. Echivalentul StackOverflow pentru A încercat ceea ce ai spus și a funcționat este să votezi în sus/accepți răspunsul 🙂 –  > Por Thorsten Dittmar.
  • Exemplul de cod actualizat însă nu funcționează, la acesta mă refer: UploadFiles uf = new UploadFiles(); uf.EnsureDirectoryExists(); Și da, voi face asta nu vă faceți griji 😉 –  > Por Dennis.
  • Ce vrei să spui prin nu funcționează? Nu văd nici un cod actualizat în întrebare, așa că nu pot răspunde corect la această întrebare. –  > Por Thorsten Dittmar.
  • Am vrut să spun că ați actualizat răspunsul, mai întâi ați avut un alt mod de a apela funcția pe care eu l-am folosit cu succes. În ceea ce privește ultimul mesaj de eroare. Au existat două erori: 1) o greșeală de scriere a numelui funcției și 2) a trebuit să o redenumesc din nou în public void în loc de public static void pentru a o putea apela astfel. dacă am pus din nou static atunci o pot apela astfel UploadFiles.EnsureDirectoriesExist(SKU); –  > Por Dennis.
lexeRoy

În primul rând, schimbați modificatorul de acces al EnsureDirectoriesExist în public thentry pentru a schimba ActionResult _EnumerateFolder metoda cu codul de mai jos:

public ActionResult _EnumerateFolder(string SKU)
{
    // create directory if it does not exist
    new UploadFiles.EnsureDirectoriesExist(SKU);

    ViewBag.SKU = SKU;
    var folder = Directory.EnumerateFiles("//servername/wwwroot/prodimg/" + SKU);
    return View(folder);
}

Comentarii

  • Metoda este privată. Nu poate fi apelată din afara clasei. –  > Por Thorsten Dittmar.
  • Mulțumesc @ThorstenDittmar, nu am reușit să văd asta. Mi-am actualizat codul acum. –  > Por lexeRoy.
Anatolii Gabuza
  1. Primul lucru care nu este corect aici este o metodă niveluri de accesibilitate. Pentru a invoca metoda din afara corpului clasei ar trebui să fie public.
  2. De asemenea, modul în care invocați această metodă este de asemenea incorect. Pentru a face acest lucru în modul dorit, ar trebui să faceți clasa dvs. static pentru a evita crearea unei instanțe a unei clase pentru a invoca metoda.

Deci:

public static class Helper 
{
      public static void EnsureDirectoriesExist(string SKU)
      {
           ...
      }
}

Comentarii

  • Mulțumesc pentru răspuns, schimbam lucrurile la întâmplare cu partea privată, acum a redevenit publică. Am redenumit clasa & funcții cu static și se pare că a rezolvat problema. Voi citi mai multe despre motivul pentru care acest lucru este important și ce face –  > Por Dennis.
Hossein Narimani Rad

Marcați-vă clasa ca fiind static apoi încercați acest lucru:

public static class UploadFiles
{

    public void EnsureDirectoriesExist(string SKU)
    {
        //your code
    }
}

Apoi:

public ActionResult _EnumerateFolder(string SKU)
{
        UploadFiles.EnsureDirectoriesExist(SKU);

        //your code
}

Don Angelo Annoni

faceți metoda directorului dvs. public și static. Apoi, o puteți apela în felul următor

Artikelhantering.Helpers::UploadFiles.EnsureDirectoriesExist(SKU);

Dacă nu puteți schimba semnătura… puteți crea o metodă de învelire publică și o puteți apela în același mod. Dacă nu puteți face metoda statică, atunci ar trebui să creați mai întâi o instanță a clasei dvs. și, în final, să apelați noua metodă publică de înfășurare.