Affichage de la Liste de retour à partir d'un contrôleur à une table dans la vue ASP.NET MVC4
J'ai une fonction dans ma classe de contrôleur, il retourne une liste de données, je veux l'afficher dans le tableau de la structure de mon point de vue page.
j'ai essayé le code suivant mais il montre une erreur
"De la classe ne contient pas de définition de GetEnumerator"
Contrôleur
public ActionResult data(Message msg,IEnumerable<sample> dept)
{
dbconnection db = new dbconnection();
sample s = new sample();
SqlConnection con = new SqlConnection(db.GetconString());
DataTable dt;
List<examplemvc1.Models.sample> datatable = new List<sample>();
dt = db.BuildDT("select * from MVCsample");
foreach (DataRow row in dt.Rows)
{
s.FirstName = Convert.ToString(row["First Name"]);
s.LastName = Convert.ToString(row["Last Name"]);
s.Address = Convert.ToString(row["Address"]);
s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
s.Location = Convert.ToString(row["Location"]);
datatable.Add(s);
dept = datatable;
}
ViewBag.tabledata = dept;
return View(dept) ;
}
Modèle
public class sample
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
public string Location { get; set; }
public string tabledata { get; set; }
}
public class Message
{
public IEnumerable<sample> sampleList { get; set; }
public string MessageText { get; set; }
public string MessageFrom { get; set; }
}
Vue
@model examplemvc1.Models.sample
@foreach (var data in Model)
{
<table><tr><td>@data.FirstName</td></tr></table>
}
Mise à JOUR
c'est ainsi que ma vue d'ensemble ressemble
@model List<examplemvc1.Models.sample>
@{
ViewBag.Title = "Registration Form";
}
<head>
<script type="text/javascript" src="../../Scripts/jquery-1.7.1.min.js"></script>
<link href="../../Style/sample.css" rel="stylesheet" type="text/css" />
<script src="../../Scripts/samplescript.js" type="text/javascript"></script>
</head>
<h2>
Registration Form </h2>
<body>
<table>
<tr>
<th>
First Name
</th>
</tr>
@foreach (var data in Model)
{
<tr><td>@data.FirstName</td></tr>
}
</table>
@using (Html.BeginForm())
{
<table id="table1">
<tr>
<td>
@Html.Label("Enter FirstName", new { @class = "standard_label_style" })
</td>
<td>
@Html.TextBoxFor(a => a.FirstName, new { @class = "class1", title = "Enter FirstName", id = "NameBox", placeholder = "Enter name", onkeydown = "return TextField(event)" })
<span class="errorMessage"></span>
@if (!ViewData.ModelState.IsValid)
{
<span class="field-validation-error">
@ViewData.ModelState["FirstName"].Errors[0].ErrorMessage</span>
}
</td>
</tr>
<tr>
<td>
@Html.Label("Enter LastName", new { @class = "standard_label_style" })
</td>
<td>
@Html.TextBoxFor(a => a.LastName, new { @class = "class1", placeholder = "Enter name", id = "LastNameBox", title = "Enter Lastname", onkeydown = "return TextField(event); " })
<span class="errorMessage"></span>
</td>
</tr>
<tr>
<td>
@Html.Label("Enter Address", new { @class = "standard_label_style" })
</td>
<td>
@Html.TextBoxFor(a => a.Address, new { @class = "class1", id = "AddressBox", placeholder = "Enter name", title = "Enter Address" })
<span class="errorMessage"></span>
</td>
</tr>
<tr>
<td>
@Html.Label("Enter PhoneNumber", new { @class = "standard_label_style" })
</td>
<td>
@Html.TextBoxFor(a => a.PhoneNumber, new { @class = "class1", id = "PhoneBox", placeholder = "Enter name", title = "Enter Phonenumber", onkeydown = "return ValidateNumber(event);" })
<span class="errorMessage"></span>
</td>
</tr>
<tr>
<td>
@Html.Label("Enter Location", new { @class = "standard_label_style" })
</td><td>
@Html.TextBoxFor(a => a.Location, new { @class = "class1", id = "LocationBox", placeholder = "Enter name", title = "Enter Location" })
<span class="errorMessage"></span>
</td>
</tr>
</table>
<input type="button" id="btnSave" value="Register"/>
<input type="button" value="Clear"/>
<input type="button" id="Tabledata" value="Tabledata"/>
<div id="div1"></div>
@*@Html.ValidationSummary()*@
<script type="text/javascript">
function ValidateNumber(e) {
var evt = (e) ? e : window.event;
var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
return true;
};
function TextField(e) {
var evt = (e) ? e : window.event;
var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
if (charCode > 31 && (charCode < 48 || charCode > 56)) {
return true;
}
else if (charCode == 8 || charCode == 9) {
return true;
}
return false
};
</script>
}
</body>
L'erreur est de mon point de vue code, en fait, je ne sais pas comment obtenir les valeurs dans la page d'affichage. Je suis novice en mvc. Merci de m'aider à résoudre ce. Toute aide sera grandement appréciée.
"Mise à jour"
J'ai résolu Mon problème avec l'aide de Stackoverflow ci-Dessous est mon correctcode
Contrôleur
public ActionResult data()
{
SomeViewModel model = new SomeViewModel();
dbconnection db = new dbconnection();
SqlConnection con = new SqlConnection(db.GetconString());
DataTable dt = db.BuildDT("select * from MVCsample");
foreach (DataRow row in dt.Rows)
{
sample s = new sample();
s.FirstName = Convert.ToString(row["First Name"]);
s.LastName = Convert.ToString(row["Last Name"]);
s.Address = Convert.ToString(row["Address"]);
s.PhoneNumber = Convert.ToString(row["PhoneNumber"]);
s.Location = Convert.ToString(row["Location"]);
model.samples.Add(s);
}
return View(model);
}
Modèle
namespace examplemvc1.Models
{
public class sample
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
public string Location { get; set; }
public string tabledata { get; set; }
}
public class Message
{
public IEnumerable<sample> sampleList { get; set; }
public string MessageText { get; set; }
public string MessageFrom { get; set; }
}
public class SomeViewModel
{
public SomeViewModel()
{
samples = new List<sample>();
sample = new sample();
}
public List<sample> samples { get; set; }
public sample sample { get; set; }
}
}
vue
@model examplemvc1.Models.SomeViewModel
//................
@foreach (var data in Model.samples)
{
<tr><td>@data.FirstName</td>
<td>@data.LastName</td>
<td>@data.Address</td>
<td>@data.PhoneNumber</td>
<td>@data.Location</td></tr>
}
</table>
Il suffit de regarder Stephen Muecke la Réponse ci-dessous, il a expliquer le contexte très clairement
- Avez-vous spécifié le modèle de la directive sur le début de page comme
model List<namespace.sample>
? - Montrez comment vous avez déclaré que le modèle de la vue. Mais vous avez plusieurs autres erreurs dans votre code (par exemple, chaque ligne ont des valeurs identiques)
- comme le modèle examplemvc1.Modèles.l'échantillon comme thi
- C'est mal de faire une liste<modèle> ou IEnumerable<Modèle>.
- ok je vais essayer
- Basé sur votre montage, vous avez besoin d'un modèle de vue avec une propriété pour la "nouvelle"
sample
et un bien pour la collection existante. - comment puis-je faire cela ?
- Créer un modèle de vue, dire
class SampleVM
et ajouterpublic List<sample> SampleCollection { get; set; } public sample NewSample { get; set; }
et passer à l'affichage, mais vous avez plusieurs autres erreurs dans votre code. Je vais ajouter une réponse détaillée plus tard. - merci de ta réponse, merci de me donner une mise à jour de réponse quand vous êtes libre, je peux attendre jusqu'à ce que, aussi je peux avoir un essai trop
Vous devez vous connecter pour publier un commentaire.
Que vous affichez est afficher à la fois une liste de
sample
et ce qui semble être une forme pour une nouvellesample
. Commencez par créer un modèle d'affichage pour représenter ce que vous voulez afficher/modifierDans votre contrôleur de modifier le code pour
Notes:
ne pas utiliser de sorte qu'ils sont inutiles, même si vous essayez et
passer ces objets à la méthode, la liaison échoue et le
les collections de null (et si vous étiez à construire le bon
chaîne de requête pour le faire fonctionner, il serait si long, il serait presque
certainement lancer une exception)
sample
à l'intérieur de laforeach
boucle(votre code seulement initialisé un objet, et chaque boucle a mis à jour son
propriétés de la ligne en cours, de sorte que vous vous retrouvez avec plusieurs
référence de l'objet même, tous les les valeurs de la dernière
ligne dans votre tableau)
ViewBag
propriété (sadéjà passé à la vue à l'aide de
return View(model);
Et de modifier votre point de vue à
Notes:
l'utilisation génère
<label for="Enter_FirstName">
mais vous n'avez pas uncontrôle avec
id="Enter_FirstName"
. Préférable vous devriez avoir[Display(Name = "Enter FirstName")]
sur la propriété, mais sinonutiliser l'vivement types helper
@Html.ValidationMessageFor()
de rendreModelState
erreurs,bien que dans votre cas, vous tous, les propriétés sont des chaînes de caractères et vous n'avez pas
ont tous les attributs de validation donc il ne sera jamais toutes les erreurs, de sorte
c'est un peu inutile
id
attribut. Il est rarement nécessairepour le remplacer. Arrêter de polluer votre balisage de comportement et d'apprendre
pour utiliser Javascript Discret
Problème, c'est votre modèle est de Type
examplemvc1.Models.sample
alors que vous avez à passer de l'objet deList<examplemvc1.Models.sample>
de vue:Votre action:
et en Vue de définir le modèle de
List<examplemvc1.Models.sample>
:et maintenant effectuer une itération de la façon dont vous êtes en train de faire:
Ici, le problème est avec votre modèle directive.
Il devrait être
au lieu de
Note: Vous êtes à la prise de cession quelques fois comme
dept = datatable;
au lieu de cela, vous pouvez mettre à jour le code comme ceci.Mise à jour
Dans un tel cas, vous devez créer viewmodel de la première et de passer son cas, il existe comme modèle.
et dans le modèle de déclaration
et puis dans le contrôleur comme suit.
et en vue, vous obtiendrez l'instance de machine virtuelle itérer sur les vm.les échantillons
et dans le reste de l'affichage de faire quelque chose comme ceci: