Saya memiliki dua pengontrol:

AaController memiliki tampilan bernama Index dan konteks database yang dapat kita panggil untuk dbContextAa

RrController juga memiliki database sendiri, yang dapat kita panggil untuk dbContextRr dan metode aksi GetData ()

Yang saya heran adalah; bagaimana caranya jika saya ingin mengambil data dari metode GetData() dan menampilkannya pada tampilan index.

Sebelumnya, saya menguji dengan Data Temp dan Sesi tanpa hasil apa pun. Saya tidak memiliki nilai sama sekali dalam tampilan dari RrDatabase. Jika saya memahaminya dengan benar, saya harus menggunakan Injeksi Ketergantungan.

Jadi di sini saya telah membuat injeksi ketergantungan (tidak yakin apakah itu benar)

Pengontrol Aa:

public class AaController : Controller
{
    private RrController rc;

    public AaController(RrController rr, AaContext aaContext)
    {
        rc = rr;
        _aaContext = aaContext;
    }

public IActionResult Index()
    {
        var dataFromRr= rs.GetData();

        ViewBag.rrData = dataFromRr;

        return View();
    }

Pengontrol Rr:

public class RrController : Controller
{
    private readonly RrContext _rrContext;

    public RrController(RrContext rrContext)
    {
        _rrContext = rrContext;
    }

public IActionResult GetData()
    {
        var data = _rrContext.RrData.Count(x => x.Pid == x.Pid);


        return RedirectToAction("Index", "Aa", data );
    }

Alih-alih nilai tampilan saya mendapatkan Microsoft.AspNetCore.Mvc.ViewResult.

Bagaimana cara mengatasi ini?

0
LittleBird 11 Maret 2017, 23:35

2 jawaban

Jawaban Terbaik

Karena metode GetData mengembalikan respons tipe IActionResult (khususnya hasil tindakan MVC, RedirectResult).

Idealnya yang harus Anda lakukan adalah, ekstrak kode yang memberi Anda data yang relevan ke metode di kelas terpisah, yang dapat Anda gunakan di banyak tempat sesuai kebutuhan (ControllerA dan ControllerR).

Mari buat antarmuka dan kelas untuk mengimplementasikannya.

public interface IRService
{
   int GetRDataCount(int pId);
}

public class RService : IRService
{
   private RrContext _rrContext;     
   public RService (RrContext rrContext)
   {
      this._rrContext=rrContext;
   }  
   public int GetRDataCount(int pId)
   {
     return _rrContext.RrData.Count(x => x.Pid == pId);
   }
} 

Anda dapat menyuntikkan implementasi IRService ke pengontrol Anda dan memanggil metode GetRDataCount untuk mendapatkan nilai int.

public class AaController : Controller
{
    private IRService rService;

    public AaController(IRService rService)
    {
        this.rService=rService;
    }

    public IActionResult Index()
    {
        int countVal = this.rService.GetRDataCount(234); // pass actual PId

        ViewBag.rrData = countVal;

        return View();
    }    
}

Pastikan untuk menambahkan pemetaan dependensi IRservice ke RService di kelas Startup Anda.

Sekarang di mana pun Anda ingin mendapatkan jumlah RData untuk pId tertentu, Anda dapat menyuntikkan implementasi IRservice dan menggunakannya (Lakukan juga di RController Anda)

2
Shyju 11 Maret 2017, 20:55

Ada beberapa pendekatan berbeda tergantung pada struktur proyek Anda dan bagaimana (dan jika) mereka dapat berkomunikasi satu sama lain.

Yang saya heran adalah; bagaimana caranya jika saya ingin mengambil data dari metode GetData() dan menampilkannya pada tampilan index.

Metode GetData() Anda sebenarnya mencoba mengembalikan Tampilan itu sendiri, namun sepertinya yang ingin Anda lakukan sebenarnya hanya mengembalikan data (yaitu hitungan) dan meneruskannya ke tindakan Anda yang lain:

public int GetData()
{
    var data = _rrContext.RrData.Count(x => x.Pid == x.Pid);
    // This will pass a parameter that contains your count
    return RedirectToAction("Index", "Aa", new { count = data });
}

Anda harus benar-benar meneruskan data Anda ke View sebagai "model". Ini dapat dengan mudah dilakukan hanya dengan mendekorasi Tampilan Anda dengan tipe data yang akan Anda lewati:

public IActionResult Index(int count)
{
    // The count parameter will have the current result of your previous call in it
    return View(count);
}

Maka Anda hanya perlu memberi tahu Tampilan Anda yang sebenarnya bagaimana Anda ingin menyajikan data (yaitu jenis apa itu) melalui arahan @model di bagian atas tampilan:

@model int

There were @Model records found.

Pertimbangkan Layanan

Implementasi yang lebih baik adalah dengan mempertimbangkan untuk menggunakan layanan yang memisahkan logika Anda dari satu pengontrol tertentu. Ini akan memungkinkan Anda untuk membuat instance layanan dan memanggilnya dari mana pun diperlukan seperti yang ditunjukkan Jawaban Shyju.

1
Community 23 Mei 2017, 12:31