2017-02-20 7 views
0

Zuerst, sorry für mein schlechtes Englisch. Ich bin aus Brasilien. Und ich bin ein Anfänger in .NET MVC5.MVC5 Hinzufügen von Werten zu Bind

Ich hatte eine Modellklasse Task mit ID plus 4 editierbare Spalten. Beim Erstellen eines neuen Task muss der Benutzer nur 2 davon ausfüllen (TaskType und Subject). Die verbleibenden zwei Spalten (UserID und CreationDate) müssen mit Informationen aus dem System gefüllt werden: Benutzer-ID und aktuelles Datum.

Dann wird in der Create, ich habe diese beiden Informationen in der ViewBag:

public ActionResult Create() 
{ 
    ViewBag.TaskTypeID = new DAO.TaskTypesDAO().ListOfTypes(); 
    ViewBag.ApplicationUserId = User.Identity.GetUserId(); 
    ViewBag.CreationDate = DateTime.Now; 
    return View(); 
} 

Und in Ansicht erstellen ich ohne zeigt es zunächst, diese Informationen zu umfassen versucht:

Zuerst habe ich versuchte HiddenFor() und nach mit DisplayFor()

@Html.LabelFor(model => model.CreationDate, "Creation Date") 
@Html.DisplayFor(model => model.CreationDate) 
@Html.HiddenFor(model => model.CreationDate) 

@Html.LabelFor(model => model.ApplicationUserId, "Creator") 
@Html.DisplayFor(model => model.User.Id) 
@Html.HiddenFor(model => model.ApplicationUserId) 

DisplayFor() etwas nicht zeigen.

Und wenn ich die Post Create Methode

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ID,TaskTypeID,Subject,CreationDate,ApplicationUserId")] Task task) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Tasks.Add(task); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.TaskTypeID = new DAO.TaskTypesDAO().ListOfTypes(); 
    ViewBag.ApplicationUserId = User.Identity.GetUserId(); 
    ViewBag.CreationDate = DateTime.Now; 
    return View(tarefa); 
} 

Das Model ist ungültig und task.CreationDate und task.ApplicationUserId sind leer vor.

Wie kann diese zwei Informationen vor dem Erstellen Post binden ????

oder sonst, Wie kann nach ModelState enthalten und revalidate ??

oder .....

+0

Sie übergeben Ihrem Modell nicht einmal ein Modell (Ihre 'HtmlHelper' Methoden binden an die Eigenschaften Ihres Modells, nicht an' ViewBag'). Aber auf jeden Fall ist das alles falsch. Sie legen die Werte von 'ApplicationUserId' und 'CreationDate' in der GET-Methode nicht fest oder enthalten keine Formularsteuerelemente für sie in der Ansicht. Sie legen sie in der POST-Methode unmittelbar vor dem Speichern des Objekts fest. Und empfehlen Sie dringend zu lesen [Was ist ViewModel in MVC?] (Http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc) –

Antwort

0

Ich verstehe nicht, warum schickst du CreationDate und ApplicationUserId zur Ansicht durch ViewBag und wieder veröffentlichen, das macht keinen Sinn. Jemand könnte das HTML leicht bearbeiten und das ApplicationUserId oder CreationDate schmieden.

Ich denke, Ihr Leben wäre viel einfacher, wenn Sie nur eine starke typisierte Ansicht dafür verwenden. Meine 2 Cent für Sie wären:

Setzen Sie alles, was Sie in einem Ansichtsmodell (Dropdown-Listen, etc.) anzeigen möchten. Hier könnten Sie wahrscheinlich füllen Sie eine SelectListItem, um Ihre Aufgaben Typen in einem Dropdown (oder eine Enum, wenn es einfach genug ist) zu zeigen.

[HttpGet] 
public ActionResult Create() 
{ 
    var viewModel = new CreateTaskViewModel 
    { 
      // [...] Put info that you need to display on the view here   
     } 

    return View(viewModel); 
} 

Erhalten Sie aktuelle Datum und die Benutzer-ID, wenn die Aufgabe zu schaffen, dass die Art und Weise der Benutzer diese Informationen nicht fälschen kann. Verwenden Sie nach dem Erstellen der Aufgabe eine Ansicht Show, wenn Sie sie dem Benutzer anzeigen möchten.

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(CreateTaskViewModel createTaskViewModel) 
{ 
    // If validation fails return to the view showing the errors 
    if (!ModelState.IsValid) { return View(createTaskViewModel); } 

    // [...] Create task object using info from viewModel 
    // and what else is necessary 

    db.Tasks.Add(task); 
    db.SaveChanges(); 

    // [...] Fills view model to show info and redirect 

    return RedirectToAction("Show", showViewModel); 
} 

ein Modell auf der Ansicht verwenden und sensible Informationen nicht auf Ihrem html versteckt setzen.

@model CreateTaskViewModel 

@Html.LabelFor(model => model.TaskType) 
// Or a dropdown list 
@Html.TextBoxFor(model => model.TaskType) 

@Html.LabelFor(model => model.Subject) 
@Html.TextBoxFor(model => model.Subject) 

andere Sache, die sehr nützlich sein kann wirklich für Sie zu studieren ist die PRG (Beitrag Redirect Get) Muster. Es ist praktisch, wenn Sie komplexere Aktionen/Ansichten haben.

+0

Dies ist genau das, was ich wollte, eine andere Möglichkeit, es zum Laufen zu bringen . Wie ich schon sagte, ich beginne gerade .NET MVC5 und ich werde eher Ihrem Vorschlag folgen und das Post Redirect Get (PRG) -Muster studieren. Danke, so sehr. – Neumann

+0

@ Neumann Gern geschehen. Vergessen Sie nicht, die Antwort für diese Frage zu setzen;) –

Verwandte Themen