En passant du Modèle de Contrôleur de la Vue dans ASP.NET MVC
Je suis en train de travailler sur ma première demande en ASP.NET MVC et l'ont exécuté un hic, que je ne peux pas comprendre, même après la lecture de l'ensemble de l'internet.
J'ai donc plusieurs points de Vue (ils sont des rapports) qui sont créés avec les Modèles de Vue, qui sont les plus peuplés basée sur des critères de sélection. Je suis en train de construire une méthode qui accepte un Modèle et les exportations (en format Excel à l'aide de EPPlus), mais le Modèle doit être envoyé à partir de l'un de ces points de Vue. C'est un peu un fonctionnel/facilité d'utilisation, plutôt que d'une exigence technique. Un utilisateur peut exécuter des rapports, et après la visualisation de l'état, peut cliquer sur un bouton/lien et une version Excel de la rapport ils sont à la recherche à sera créé. Je veux passer le Modèle, la Vue affichée est basée sur étant donné que le travail a déjà été fait pour construire ce Modèle de Vue selon le rapport, les critères de sélection.
Tout ceci est bel et bon, et je peux passer avec succès un Modèle à partir d'une Vue affichant un rapport à la méthode qui établit le rapport. Toutes les données dans le Modèle de Vue je passe semble être là, sauf une collection de Modèles (IEnumerable) qui en fait partie. <--c'est là Que je suis bloqué. La collection de IEnumerable a 0 articles dans elle au point d'arrêt, mais ce n'est certainement pas le cas lorsque le Modèle est créé et est passé dans la Vue d'abord.
Je suis coincé--s'il vous plaît aider.
Modèle De Vue:
public class ReportViewModel
{
public int ProjectId { get; set; }
[Display(Name = "Project Name")]
public string ProjectName { get; set; }
[Display(Name = "Project #")]
public string ProjectNumber { get; set; }
public IEnumerable<SystemModel> SelectedSystems { get; set; }//has items when created and passed into the View intially, but not when the Model is passed from the View to the method/controller.
[Display(Name = "All Systems")]
public bool AllSystems { get; set; }
[Display(Name = "In Progress Systems")]
public bool InProgressSystems { get; set; }
[Display(Name = "Completed Systems")]
public bool CompletedSystems { get; set; }
[Display(Name = "Unchecked Systems")]
public bool UncheckedSystems { get; set; }
[Display(Name = "Systems with Problems - Ours")]
public bool JciIssue { get; set; }
[Display(Name = "Systems with Problems - Other's")]
public bool OtherIssue { get; set; }
[Display(Name = "Include Points with Problems")]
public bool IncludePoints { get; set; }
}
Vue:
@model ProjectOps_5.ViewModels.ReportViewModel
@{
ViewBag.Title = "Software Cx Status Report";
}
<h2>Software Cx Status Report</h2>
<div>
<div>
<hr />
@Html.ActionLink("Export to Excel", "ExportExcel", Model)//call to method
//the report
Méthode:
public void ExportExcel(ReportViewModel model)
{
//make Excel file
}
OriginalL'auteur amartin | 2015-08-20
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas passer d'un modèle qui contient des propriétés qui sont des objets complexes ou des collections à un GET. En interne, le
ActionLink()
méthode appelle la.ToString()
méthode de chaque propriété de sorte fondamentalement laDefaultModelBinder
est d'essayer de définir la propriété comme suitqui ne tient pas et la propriété est
null
.Heureusement, il ne fonctionne pas, ou vous devez générer un vraiment laid de la chaîne de requête et pourrait facilement dépasser la chaîne de requête de limite et de lever une exception.
Au lieu de cela, passer le
ProjectId
bien (je suppose qu'identifie l'objet) et d'obtenir le modèle de nouveau dans leExportExcel()
méthodeet dans le contrôleur
Pas assez de détails pour être sûr de ce que vous devez faire, mais bien sûr, vous pouvez toujours passer supplémentaires route des valeurs qui définissent votre filtre/commande/etc dans le
ActionLink()
Donc, en d'autres termes, il y aura beaucoup plus de SystemModels sous un ProjectModel que ce que j'ai besoin d'inclure dans le rapport.
OK, je vais y réfléchir. Je suppose que je pourrais transmettre l'Id de tous les SystemModels j'ai besoin mais qui ne semble pas être la bonne chose à faire.
Tout ce que je peux faire, c'est donner la réponse à la question c'est :). Vous suggère de faire quelques recherches et ensuite poser une nouvelle question si votre avoir des problèmes
OriginalL'auteur
En passant, le point de vue du modèle à l'autre méthode est probablement pas la meilleure idée, étant donné que vous ne connaissez pas la taille du modèle (le nombre d'éléments dans
SelectedSystems
). Si elle est trop grande vous pouvez dépasser le max de longueur de demande ou de permettre à l'utilisateur d'attendre trop longtemps jusqu'à ce que la demande se termine.Mais si vous êtes absolument sûr que c'est ce que vous avez besoin - il peut être fait à l'aide d'un formulaire:
Cependant, une meilleure approche serait d'utiliser certains identificators de tous les objets que vous souhaitez exporter (pas sûr de ce qu'ils pourraient être dans votre cas) et de transmettre ces codes d'identification de la
ActionLink
route des valeurs.OriginalL'auteur holdenmcgrohen
Pouvez-vous essayer en dessous de la logique , que vous avez à faire avant l'envoi de la demande(ou dépend de votre page, mais il devrait être disponible avant l'envoi de la demande)
Je veux dire, si c'est les propriétés de collection, alors vous devez ajouter un champ caché pour chaque enregistrement, et pour chacune des propriétés, avec Index, j'espère donc que vous souhaitez transmettre des données de propriété IEnumerable<SystemModel> SelectedSystems donc pour le premier enregistrement, vous devez ajouter 1 champ caché(compte pour 1 terrain) comme <input type="hidden" name="SelectedSystems[0].PropertyName" id="SelectedSystems_0_PropertyName" /> pour le 2ème enregistrement <input type="hidden" name="SelectedSystems[1].PropertyName" id="SelectedSystems_1_PropertyName" />, et il devrait être dans votre page bindings de sorte que vous pouvez faire une boucle en javascript et d'ajouter dans un div vide.
Laissez-moi savoir si vous n'avez toujours pas comprendre
OriginalL'auteur Ravi