ASP MVC formulaire pour appeler une action spécifique et pas de redirection mais la mise à jour de la page d'origine
Je suis en utilisant ASP.net MVC 3 pour un projet, et à un point où je comprends plus, mais aussi en essayant d'apprendre les différences entre elle et les Formulaires monde, j'ai utilisé pendant si longtemps. Précédemment dans WebForms vous venez de mettre les champs là-bas, ajoutez un bouton, et de créer un événement, puis de gérer tout ce que vous devez à la publication.
Par exemple, j'ai un simple point de vue qui montre les détails de l'erreur. Je veux pousser une partie de l'information à propos de cette erreur à notre outil de suivi de l'API. Disons tout simplement le sujet et le contenu de l'erreur. Je voudrais en HTML faire quelque chose comme:
<form action="@Url.Action("Send")" method="post">
<input id="subject" name="subject" type="text" value="@Model.subject" />
<br />
<input id="content" name="content" type="text" value="@Model.content" />
<br />
<input type="submit" value="Send" />
</form>
J'ai trouvé que la mention de mon ID d'entrée est de faire correspondre les noms de paramètre dans mon contrôleur, puis laissez-moi passer ces paramètres. Ceci est similaire à ce que vous voyez dans ce vieux poste par Scott Guthrie.
Tout d'abord, je tiens à appeler "Envoyer" dans mes Erreurs contrôleur, et non pas mes coordonnées. Ce fait ne l'appelle mon "Envoyer" action, mais alors redirige vers localhost/Erreurs/Envoyer, que je ne veux pas que ça.
Je veux être en mesure de soumettre ce formulaire, qui appelle l'action et le travail avec l'API à distance, et ensuite mettre à jour un message sur la page en cours, indiquant que l'erreur a été transféré.
Une fois que le problème a été soumis au bug tracker, comment puis-je, par exemple, afficher un DIV sur la page d'origine en passant arrière de contenu (par exemple, un lien vers la question dans le bug tracker)?
Mise à jour: Voici ce que je fais dans mon controller:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/redmine/issues.json");
request.Credentials = new NetworkCredential("username", "password");
request.Method = "POST";
request.ContentType = "application/json";
request.Accept = "application/json";
using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write("'issue': { " +
"'project_id': 'project', " +
"'subject': 'Test issue'" +
"}");
}
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
string json = "";
using (StreamReader reader = new StreamReader(stream))
{
json = reader.ReadToEnd();
}
Aussi, ici, est ce que je fais de mon point de vue (simplifié, et après aide de Phillip)
@model webapp.Models.app_errors
<script type="text/javascript">
function SendErrors() {
alert(@Model); //here I get a 'webapp undefined error'
alert(Model); //Model is undefined. If I reference @Model.App_name or another value anywhere, works fine in rest of view
$.ajax({
type: 'POST', //(probably)
url: '../SendToRedmine',
cache: false, //(probably)
dataType: 'json', //(probably)
data: @Model,
success: function(result)
{
alert("The error has been transferred");
//you can also update your divs here with the `result` object, which contains whatever your method returns
}
});
}
</script>
<input type="button" onclick='SendErrors()'/>
OriginalL'auteur jmlumpkin | 2012-05-25
Vous devez vous connecter pour publier un commentaire.
En réponse à votre première question, essayez cette surcharge de l'Url.Action:
Et à votre deuxième question: Vous aurez envie de le faire via AJAX.
Fondamentalement, pour la première fois le chargement de la page, de retour que vous souhaitez afficher à l'écran. Ensuite, avoir une fonction ajax de cette forme:
Quelques choses à noter:
1) L'url est automatiquement ajouté à inclure les données de
data
.2) Votre méthode d'action doit maintenant accepter un paramètre. Il existe de nombreuses façons d'aller à ce sujet. J'ai ajouté un exemple de ce que votre méthode d'action pourrait ressembler dans le code ci-dessous.
et puis, votre bouton est
onclick
événement va appeler cette fonction, comme ceci:Ce qui se passe ici est que, lorsque le bouton est cliqué, Ajax asynchrone (par défaut) appuyez sur votre méthode d'action, et votre méthode d'action sera de faire ce qu'il doit faire avec les erreurs, et puis quand c'est fini, le
success
rappel sera frappé.EDIT: maintenant, votre action pourrait ressembler à quelque chose comme ceci:
Maintenant, cela suppose que l'objet JSon
dummy
a les mêmes champs que laError
classe. Si oui, MVC n'automatique de la liaison de données. Vous pouvez également utiliser un plus génériqueFormCollection
pour le paramètre. Vraiment, vous pouvez utiliser ce que vous voulez, mais vous aurez envie d'envelopper tout ce que vous voulez dans un objet JSon.Edit-- pour votre dernière question, cela devrait fonctionner:
Ajouter l'extension suivante de la méthode à votre application:
Ou si vous le souhaitez, vous pouvez simplement ajouter une méthode ToJson() à votre classe de modèle, et ensuite:
dans le js juste avant l'appel ajax. Ensuite, utilisez la
model
variable pour votredata
paramètre.Il a travaillé avec quelques modifications mineures (les virgules vraiment), mais la seule question est de savoir comment dois-je "charge" factice. Comme, auparavant, j'étais à l'aide d'un formulaire et d'action.
En fait,
data
est l'objet de la envoyé pour le serveur. Doncdummy
est ce que vous seriez d'envoi pour le serveur. Ce que vous êtes probablement en train de "charge" estresult
, dans cet exemple.result
est retourné à partir de n'importe quelle action les appels ajax (l'url) -- gardez à l'esprit MVC qu'une url de la forme http://www.x.com/Controller/Action vous redirigera vers la "Action" action dans le contrôleur nommé Contrôleur. Donc permet de dire que l'action renvoie un booléen pour savoir si ou de ne pas afficher le message d'erreur (vous aurez probablement envie de quelque chose de plus complexe, comme un objet JSon, mais c'est pour des raisons de simplicité), --Vous devez ensuite faire quelque chose de la forme: if(result){ //afficher le message }
Qui fait sens. Je suppose que ce que je demande est de savoir comment dois-je insérer des données dans les de "crétin", et ce qui allait se passer dans mon contrôleur? Actuellement, ce code appelle mon contrôleur (qui était en train de faire le post correctement) à l'aide d'un HTTPWebRequest. Je vois comment je peux passer de retour conséquent, un peu confus sur la façon de passer de la Vue vers le Contrôleur de ce que je veux mettre au service.
OriginalL'auteur Phillip Schmidt
MVC, une "action" est essentiellement une "page". (pas exactement, mais avec de routage, cela finit par être surtout vrai)
Qui est, vos actions sont regroupées en catégories et de naviguer à l'aide de routage au sein du framework MVC.
Je pense que ce que vous voulez faire ici, c'est de faire un appel AJAX qui envoie de votre message d'erreur à un service web.
Court de cela, vous pouvez utiliser jQuery pour insérer un caché
div
qui contient unIFrame
avec une autre action de la page. Je ne le recommande pas, cependant.OriginalL'auteur Codeman
Il y a deux possiblités.
Dans vos Erreurs/Envoyer de l'action rediriger l'utilisateur vers le localhost/Erreurs/page de Détails. Cela peut être fait avec un la
Redirect()
méthode sur le contrôleur. Le problème avec cette approche est que c'est un appel bloquant. L'utilisateur devra attendre jusqu'à la distance de l'api a été appelé et a répondu.Utiliser de l'AJAX approche comme mentionné dans les commentaires. L'inconvénient c'est que c'est un peu plus complexe et vous pouvez avoir à interroger le service pour récupérer l'état, sauf si c'est un "tire et oublie" appel, alors c'est de l'argent.
À l'aide d'AJAX est la solution la plus élégante.
Oui, Phillip réponse est un bon début.
OriginalL'auteur Chuck Conway
À l'aide d'AJAX serait une de la résolution de ce. Mais vous voudrez peut-être repenser la behevior de la page. Si c'est votre soumettre le problème de la page, voulez-vous de rester sur cette page une fois que vous soumettre un problème. Ce que si je continue à soumettre des questions, voudriez-vous pour voir le lien que pour la dernière? Vous pourriez avoir à interroger le serveur pour obtenir un lien pour une question, ce qui rend encore plus difficile.
Sans connaître les conditions, il n'est pas facile de venir avec une solution, mais en général, je préfère aller à un autre numéro de page une fois qu'il est soumis à partir d'une page de soumission (quelque chose comme ~/question/id).
Aussi, vous pouvez utiliser
Html.TextboxFor(m=>m.subject)
ou certains de la syntaxe comme ça, de cette façon, vous n'aurez pas à correspondre à l'id d'entrée manuellement pour chaque propriété.OriginalL'auteur AD.Net