MVC4 Passant Objet Complexe à partir de la Vue du Contrôleur, nouveau point de Vue n'est pas rendu
Je suis très nouveau pour MVC et ont rencontré ce problème lors de la tentative de port d'un site existant pour MVC4.
Nous sommes à l'aide de modèles où une grande partie des données est peuplée par des appels de service, alors, évidemment, nous aimerions que les appels à un minimum. Le problème est que lorsque j'essaie de passer le modèle vers le contrôleur, le complexe des objets dans le modèle invariablement deviennent nuls. J'ai été en mesure de stocker les données sur un appel vers le contrôleur à l'aide d'ajax; cependant, j'ai besoin de l'action de retour une nouvelle vue, et après la fin de l'action, le code de la vue exécute, mais il n'y a pas de redirection (qui je crois est le point d'ajax, je pense que ce que je demande, c'est une solution qui va persister les données de la même manière mais en fait de redirection).
Voici mon modèle:
public class DistributionModel
{
public string typeOfDistribution { get; set; }
public Document document { get; set; }
public string thumbnailUrl { get; set; }
public MergeFieldModel mergeFields { get; set; }
}
public class MergeFieldModel
{
public MergeFields documentMergeFields { get; set; }
}
Ici, c'est le contrôleur de l'action, je suis en utilisant:
public ActionResult Index(DistributionModel distributionModel)
{
distributionModel.mergeFields = new MergeFieldModel() { documentMergeFields = MergeFieldsHelper.GetDocumentMergeFields(distributionModel.document.Id) };
return View("Index", distributionModel);
}
J'ai essayé à l'aide d'un [email protected]("l'Indice", le Modèle) au lieu du bouton dans le bloc ci-dessous pour appeler le contrôleur et effectuer la redirection (redirection lui-même n'a fonctionné, mais j'ai ensuite eu à effectuer un autre appel de service dans le contrôleur pour récupérer le même document que je travaillais avec de l'appel de la vue) parce que l'objet Document dans le modèle de cesse de revenir comme NULLE pour le contrôleur.
Ici est la partie de la vue qui est appeler le contrôleur et retourne en fait le modèle complet: je crois que ce que je cherche, c'est un moyen d'atteindre cet objectif sans ajax afin que je puisse obtenir la redirection vers la Distribution/Index page (c'est tiré de Distribution/DocumentDetails page)
<button id="EmailDistribution" data-corners="false" data-theme="a">EMAIL</button>
$('#EmailDistribution').click(function () {
var model = @Html.Raw(Json.Encode(Model));
$.ajax({
url: '@Url.Action("Index", "Distribution")',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(model),
processData: false,
});
});
Grâce, toute aide serait très appréciée.
return RedirectToAction("Index", distributionModel);
en tant que dernière ligne de Distribution/DocumentDetails
action?Le DocumentDetails action renvoie la DocumentDetails vue. En outre, j'ai essayé de faire un RedirectToAction à partir de l'une des méthodes de contrôleur, et trouvé qu'il a passé l'objet d'un Document à l'autre d'action NULLE.
OriginalL'auteur gutsmania | 2012-11-09
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr si j'ai bien compris votre problème exactement, mais je peux vous dire que vous aurez besoin de mettre chaque valeur unique de votre modèle dans un formulaire posté à l'action d'un contrôleur que vous souhaitez pas être null.
C'est exactement ce que vous faites dans votre appel ajax: - Vous actuellement de transformer l'ensemble du modèle en json et utiliser le jQuery capacité de se transformer à nouveau pour publier des données. En supposant que vous avez le modèle suivant par exemple:
Votre code javascript va créer une chaîne similaire à
{ A: 'Value for a', B: 'Value for B' }
qui seront transformés en une requête HTTP POST à l'aide de jQuery:Comme un résultat de votre
Index
action sera appelée et de l'DefaultModelBinder
lie les valeurs de vos propriétés du modèle. Cela fonctionne pour les types primitifs tels que les entiers ainsi que pour les types complexes comme les collections par exemple. LeDefaultModelBinder
gère la transformation de ces types.Jetons un coup d'oeil à un modèle plus complexe:
La
DefaultModelBinder
est également capable de lier des modèles comme ceux-ci:Il en résultera une nouvelle instance de
ComplexModel
avec sesSubModel
propriété est définie à une instance d'ComplexSubModel
avec ses biensStringList
définie à une instance d'System.Collection.Generic.List<string>
contenant trois chaînesFirst entry
,Second entry
etThird entry
.Maintenant ce que vous avez à faire est de rendre votre modèle de propriétés de champs cachés, par exemple, ils sont inclus dans une publication:
Tous les biens inclus dans la publication ne sera pas être null mais pourrait avoir été forgé par l'utilisateur car ils sont simples re-transmis au serveur en supposant qu'ils ont été rendus dans des champs cachés. En fait, vous ne pouvez pas être sûr que la re-transmis les valeurs sont celles que vous avez récupérée par un appel de service précédemment.
Une autre possibilité serait d'enregistrer les résultats d'un appel de service dans le
TempData
-dictionnaire qui, en fait, stocke les valeurs dans un utilisateur de la session et les détruit dès qu'ils sont re-lire dans l'action de publication ou bien directement stocker les valeurs dans une session:Les deux variantes ont des avantages et des contras, comme cela peut être problématique lors de la navigation dans deux onglets au sein d'une session de navigateur, par exemple, ou la nécessité pour les classes sérialisables lorsque vous utilisez un état de session du serveur. Néanmoins, la procédure est toujours la même: Vous devrez
Choisissez votre poison. 😉
OriginalL'auteur Peit