2010-07-13 5 views
0

J'ai une vue partielle (contrôle utilisateur) qui est partagée par mes vues Créer et Modifier. Lorsque je l'utilise dans l'affichage Modifier, je dois inclure un champ caché (Html.HiddenFor) pour empêcher une erreur «Row changed or not found» dans mon service de données, mais lorsque je l'utilise dans la vue Créer, je dois supprimer le champ PK caché, pour éviter une erreur sur l'insertion d'une colonne d'identité.Problème avec la clé primaire dans une vue partielle partagée par les vues Créer et modifier

Il n'est pas possible de ne pas utiliser les colonnes d'identité dans cette application, alors comment puis-je «activer» ce champ caché PK en fonction de l'action invoquée?

Code Postal Action:

[HttpPost] 
    public ActionResult Edit(JobCardViewData viewData) 
    { 
     try 
     { 
      jobCardService.Update(viewData.JobCard); 

Modifier Voir Extrait:

<% Html.RenderPartial("JobCardInput", Model); %> 

Extrait partielle:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Poynting.Installation.Web.ViewData.JobCardViewData>" %> 
<% using (Html.BeginForm()) 

Répondre

1

quand je l'utilise dans la zone Créer vue, je dois supprimer le champ caché PK, pour éviter une erreur sur la tentative d'insertion dans une colonne identity.int dans une colonne d'identité.

laisser le champ caché et mettre à jour l'action Créer pour vérifier si la valeur est 0 ou une valeur nulle (I suppose que JobCard est un type d'argument de l'action Créer). Une autre idée consisterait à recréer un nouvel objet JobCard, ce qui exclut la définition de la valeur de l'ID et à envoyer le nouvel objet à la méthode create jobCardService.

alors comment puis-je champ « switch » qui PK caché ou désactiver en fonction de laquelle l'action a été invoquée?

Vous pouvez éventuellement créer un HtmlHelper pour rendre le champ caché pour vous. Vérifiez la collection ViewContext RouteData pour le nom de l'action en sortie le champ masqué en conséquence si nécessaire. (Pseudo-code ..)

public static MvcHtmlString HiddenTest(this HtmlHelper htmlHelper, string name) 
{ 
    string currentAction = htmlHelper.ViewContext.RouteData.Values["action"].ToString(); 
    if (currentAction = "Edit"){ 
    return htmlHelper.Hidden(htmlHelper, name); 
    } 
    return null; 
} 
+0

mon problème ici avec votre première suggestion est le JobCardId est int, donc ce n'est jamais nul, et la valeur que le contrôleur récupère de la vue (en utilisant le champ caché) est 0, qui va avec le jobCard au servive. Votre seconde est belle, et j'ai fait autre chose sans vous y attacher. Merci! – ProfK

+0

Tout à fait d'accord sur la première option - un int ne sera jamais nul, mais dans votre contrôleur, vous pouvez vérifier s'il est 0 et ensuite recréer un nouvel objet de la carte de travail à partir des valeurs affichées. – Ahmad

0

peut yo Vous avez votre PK dans l'url?

ThingController/Créer

ThingController/Modifier/1234

+0

Sur l'action de modifier get, il est dans l'url (valeur 1), mais quand je clique sur Enregistrer, dans l'action de modifier post est réglé sur 0 dans l'URL, à moins que J'inclus ce champ caché pour cela. – ProfK

+0

Dans le poste de création qui fait la sauvegarde, enregistrer vos données et obtenir l'ID, la rediriger vers la page d'édition avec l'ID –

+0

@Anthony, je ne suis pas en train d'éditer après une création. J'essaye d'éditer de la liste ma vue d'index, et j'ai l'id quand j'appelle l'édition. – ProfK

Questions connexes