Odwołanie się z poziomu widoku do zmiennej zdefiniowanej w kontrolerze

0

Witam, chciałem się dowiedzieć, jak odwołać się z poziomu widoku do zmiennej zdefiniowanej w kontrolerze ?

Chciałbym móc wyszukiwać konkretną książkę z biblioteki, dlatego właśnie utworzyłem kontroler Search.

Przykładowy kod:

Model:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lab01.Models
{
    public class BibliotekaModel
    {
  
        public string Ksiazka { get; set; }
        public int Pozycja { get; set; }

    }
}

Kontroler

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using lab01.Models;

namespace lab01.Controllers
{
    public class BibliotekaController : Controller
    {
        static List<BibliotekaModel> data = new List<BibliotekaModel>();
        // GET: Biblioteka
        public ActionResult Index(int? id = null)
        {
            ViewBag.data = data;
            ViewBag.biblioteka = id != null ? data[id.Value] : null;
            return View();
        }

        public ActionResult Add(string ksiazka, int pozycja)
        {
            data.Add(new BibliotekaModel() { Ksiazka = ksiazka, Pozycja = pozycja });
            return RedirectToAction("Index");
        }

        public ActionResult Search(string szukana)
        {
            var ksiazka = data.Where(p => p.Ksiazka == szukana);
            return View();
        }
    }
}
 
@{
    ViewBag.Title = "Search";
}

<h2>Search</h2>
<form method="get" action="/Biblioteka/Search">
    <table border="1">
        <tr>
            <th> Szukana pozycja </th>
            <th> Znaleziono </th>
        </tr>
        <tr>
            <td><input name="Szukana" type="text" /></td>
            
        </tr>
    </table>
</form>


2

return View(ksiazka), a w widoku masz właściwość Model.

0

Niestety w dalszym ciągu, nie otrzymuje widoku którego chciałem. Przy silnym typowaniu na widok przekazuje się: "System.Linq.Enumerable+WhereSelectListIterator`2[lab01.Models.BibliotekaModel,System.String]".
Chciałem wyszukać książkę w bibliotece, a następnie ją wyświetlić.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using lab01.Models;

namespace lab01.Controllers
{
    public class BibliotekaController : Controller
    {
        static List<BibliotekaModel> data = new List<BibliotekaModel>();
        // GET: Biblioteka
        public ActionResult Index(int? id = null)
        {
            ViewBag.data = data;
            ViewBag.biblioteka = id != null ? data[id.Value] : null;
            return View();
        }

        public ActionResult Add(string ksiazka, int pozycja)
        {
            data.Add(new BibliotekaModel() { Ksiazka = ksiazka, Pozycja = pozycja });
            return RedirectToAction("Index");
        }

        public ActionResult Search(string szukana)
        {
            //ViewData["ksiazka"] = data.Where(p => p.Ksiazka == szukana).Select(p => p.Ksiazka);
            var VM = data.Where(p => p.Ksiazka.Contains(szukana)).Select(p => p.Ksiazka).ToString(); 
            if(VM == null)
            {
                return RedirectToAction("Index");
            }
            return  View(VM);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lab01.Models
{
    public class BibliotekaModel
    {
  
        public string Ksiazka { get; set; }
        public int Pozycja { get; set; }
        public override string ToString()
        {
            return "to ja twoj obiekt";
        }

    }
}


@model lab01.Models.BibliotekaModel

@{
    ViewBag.Title = "Search";
}

<h2>Search</h2>
<form method="get" action="/Biblioteka/Search">
    <table border="1">
        <tr>
            <th> Szukana pozycja </th>
            <th> Znaleziono </th>
        </tr>
        <tr>
            <td><input name="Szukana" type="text" /></td>
            <td>@Model.Ksiazka</td>
        </tr>
    </table>
</form>


0

Chcesz aby widok przymował lab01.Models.BibliotekaModel, a wysyłasz tam stringa: data.Where(p => p.Ksiazka.Contains(szukana)).Select(p => p.Ksiazka).ToString().

0

Udało się :) trzeba było użyć takiego wyrażenia lambda

 var VM = data.Where(p => p.Ksiazka.Contains(szukana)).FirstOrDefault();

Dlatego, że używajac np takiego wyrażenia

var VM = data.Where(p => p.Ksiazka.Contains(szukana)).Select(p => p); 

przekazywałem listę IEnumerable zamiast pojedynczego elementu, co skutkowało tym, że generowało mi błędy.

Dzięki za pomoc

0

@balti: a czemu nie po prostu: var vm = data.FirstOrDefault(p => p.Ksiazka.Contains(szukana));?

0

W sumie to nie wiem, czemu tak nie zrobiłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1