2009-11-14 5 views
3

J'ai deux tables Utilisateurs et dépenses dans le backend. UserId est une clé étrangère pour la table des dépenses. J'ai besoin de passer l'UserId du Usercontroller au ExpenseController pour enregistrer les informations de dépenses par rapport à l'ID de l'utilisateur. Mais il y a deux problèmes.ASP MVC clé étrangère Envoyer un problème

  1. Je ne peux pas utiliser le paramètre id qui est transmis au contrôleur de charge
  2. Une autre est pour la créer sous forme de frais, je ne pouvais pas trouver un champ userId dans la la forme contre laquelle je vais sauver la dépense. Donc, il y a toujours modelstate.isvalid == false.

Veuillez regarder le code suivant. J'espère que tu peux m'aider.

// UserController

public ActionResult Index() 
{ 
    return View(db.Users.ToList()); 
} 

// Voir Inedx (utilisateur)

<%= Html.ActionLink("Expenses", "Index", "Expense", new { id=item.Id}, null)%> 

// ExpenseController

public ActionResult Index(int id) 
{ 
    ViewData["id"] = id; 
    return View(db.Expenses.Where(x => x.Users.Id == id).ToList()); 
} 

// vue d'index (frais)

<%= Html.ActionLink("Create New", "Create", new { id=ViewData["id"]})%> 

// frais Controller (Créer)

public ActionResult Create(int id) 
    { 
     //ViewData["id"] = id; 
     return View(); 
    } 

// Création Voir

<% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Fields</legend> 

     <p> 
      <label for="ExpenseTitle">ExpenseTitle:</label> 
      <%= Html.TextBox("ExpenseTitle") %> 
      <%= Html.ValidationMessage("ExpenseTitle", "*") %> 
     </p> 
     <p> 
      <label for="ExpenseDescription">ExpenseDescription:</label> 
      <%= Html.TextBox("ExpenseDescription") %> 
      <%= Html.ValidationMessage("ExpenseDescription", "*") %> 
     </p> 
     <p> 
      <label for="Date">Date:</label> 
      <%= Html.TextBox("Date") %> 
      <%= Html.ValidationMessage("Date", "*") %> 
     </p> 
     <p> 
      <label for="Expense">Expense:</label> 
      <%= Html.TextBox("Expense") %> 
      <%= Html.ValidationMessage("Expense", "*") %> 
     </p> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

// Créer un message

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection collection) 
    { 
     var expense = new Expenses(); 
     try 
     { 
      TryUpdateModel(expense, new string[] {"UserId", "ExpenseTitle", "ExpenseDescription", "Date", "Expense" }, collection.ToValueProvider()); 

       if (ModelState.IsValid) 
       { 
        db.AddToExpenses(expense); 
        db.SaveChanges(); 
        return RedirectToAction("Index",int.Parse(collection["UserId"])); 
       } 
       else { 
        return View(expense); 
       } 


      } 
      catch 
      { 
       return View(expense); 
      } 
     } 

Répondre

7

Je crois que le consensus droit façon de le faire est de construire des modèles spécifiques pour chaque vue et remplir ce modèle avec les données nécessaires à la vue, y compris les données nécessaires à toute action que la vue invoque. Ainsi, par exemple, vous auriez un modèle de dépenses que votre vue Créer prendrait, l'une des choses qu'il contiendrait serait l'identifiant de l'utilisateur associé à la dépense. L'action Créer qui gère la publication prend un modèle de dépenses, au lieu d'une collection de formulaires, en tant que paramètre. Dans votre vue Créer, vous stockez l'ID utilisateur du modèle dans un champ masqué afin que sa valeur soit renvoyée à la publication.

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Create(int id) 
{ 
    return View(new ExpenseModel { UserId = id }); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(ExpenseModel expense) 
{ 
    ... 
} 

Voir

... Inherits="System.Mvc.ViewPage<ExpenseModel>" %> 

<% using (Html.BeginForm()) { %> 

    <%= Html.Hidden("UserId") %> 

    ... 
<% } %> 
+0

Merci pour votre réponse – FlintOff

+0

@ASP MVC - vous êtes les bienvenus. Puisque vous êtes nouveau ici, je ferai remarquer que la façon dont le système fonctionne est que vous trouvez des réponses positives que vous trouvez utiles en utilisant les flèches haut/bas à côté du nombre de votes en haut de chaque réponse (une fois que vous avez assez de points) et acceptez la question qui répond le mieux à votre question en utilisant la coche juste en dessous du nombre de votes. Bienvenue sur le site. – tvanfosson