2012-04-03 2 views
0

HINWEIS: Bearbeiten das ModellWie Sie einen Abfragezeichenfolgeflag guid Wert in meinen Controller erstellen, ohne die Seltsamkeit

Das Problem hinzuzufügen: ein Abfragezeichenfolgeflag guid Wert gibt ich paßt, versuchen, es in meinen Controller zu bekommen, damit ich eine erstellen kann neuer Rekord damit als Parameter. Die nächste, die ich bisher bekommen habe, lädt einen Datensatz mit allen 0 und Bindestrichen für die GUID (was nicht nur falsch ist, sondern auch sehr komisch aussieht.)

Dies ist in MVC3/EF4 mit einer Legacy-Datenbank und einigen Legacy-Seiten und URLs. Die Anwendung, an der ich arbeite, enthält eine Notizfunktion, mit der Benutzer A Notizen zu Benutzer B machen kann (z. B..) Beide Benutzer haben ihre eigenen GUID-IDs, die sie identifizieren, und die Tabelle, in der die Notizen gespeichert sind Id-Spalte für die Notiz selbst und dann zwei Id-Spalten, um zu verfolgen, welcher Benutzer A ist und welcher Benutzer B für diese spezielle Notiz ist.

Wir können immer davon ausgehen, dass Benutzer A der aktuelle Benutzer ist und seine ID auf diese Weise erhalten. Einer der Legacy-URLs ist, wie Sie die Id für Benutzer B.

Zum Beispiel erhalten: www.mysite.com/notes/user/ED88B0B1-B552-4D63-BD20-C94B837440BE

"Benutzer A" in unserem Beispiel hat die guid von ScannerUserId

"Benutzer B" (aus dem Abfragezeichenfolgeflag) die guid von ScannedCodeId

Hier ist das Modell:

public partial class Note 
{ 
    public System.Guid ScannerUserId { get; set; } 
    public System.Guid ScannedCodeId { get; set; } 
    public System.Guid NoteId { get; set; } 
    public string NoteDetail { get; set; } 

    public virtual Code Code { get; set; } 
    public virtual Contact Contact { get; set; } 
} 

hier die Ansicht:

@model MySite.Models.Note 

@{ 
ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Note</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.NoteDetail) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.NoteDetail) 
     @Html.ValidationMessageFor(model => model.NoteDetail) 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

Und hier ist der Controller Abschnitt erstellen:

public class NoteController : Controller 
{ 
    // 
    // GET: /Note/Create 

    public ActionResult Create() 
    { 
     ViewBag.ScannedCodeId = new SelectList(db.Codes, "CodeId", "ScannedCodeId"); 
     ViewBag.ScannerUserId = new SelectList(db.Contacts, "UserId", "ScannerUserId"); 
     return View(); 
    } 
    // 
    // POST: /Note/Create 

    [HttpPost] 
    public ActionResult Create(Note note) 
    { 
     if (ModelState.IsValid) 
     { 
      note.NoteId = Guid.NewGuid(); 
      note.ScannerUserId = (Guid)System.Web.Security.Membership.GetUser().ProviderUserKey; 
      //note.ScannedCodeId = new Guid(Request.QueryString[""]); 
      note.CreateDate = DateTime.Now; 
      note.LastActivityDate = DateTime.Now; 
      db.Notes.Add(note); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.ScannedCodeId = new SelectList(db.Codes, "CodeId", "ScannedCodeId", note.ScannedCodeId); 
     ViewBag.ScannerUserId = new SelectList(db.Contacts, "UserId", "ScannerUserId", note.ScannerUserId); 
     return View(note); 
    } 

Wie erhalte ich die GUID, die in der Abfragezeichenfolgeflag in die note.ScannedCodeId so ist, dass die db.SaveChanges up nicht sprengen wird auf mich?

Und auch, danke für das Lesen dieses weit und alles, was Sie tun können, um zu helfen.

Antwort

1

Ich glaube Hinweis ist Ihre ViewModel.Add eine WrittenFor Eigenschaft zu diesem

(Ich bin mit Int-Datentyp in diesem Beispiel diese Antwort einfach zu halten und viel lesbar. Sie es mit der Zeichenfolge für Ihre eindeutige ID ersetzen/guid)

public class Note 
{ 
    public string NoteDescr { set;get;} 
    public int WrittenBy { set;get;} 
    public int WrittenFor { set;get;} 

} 

und in der diese Ansicht Modell get Aktionsmethode zurückzukehren

[HttpGet] 
public ActionResult Create(int friendId) 
    { 
     Note objVm=new Note(); 
     objVm.WrittenFor=friendId; 
     return View(objVm); 
    } 

So zu Ihrer Ansicht kann der Benutzer dieses p zugreifen Alter durch das Surfen wie

http://yourdomain/yourcontroller/create/589476 

Das bedeutet, dass Sie (Die aktuelle Verwendung ist in der Wand (oder Buch beachten .. :)) von Benutzer-ID 589476.

und in Ihrer Ansicht nach hat es in der Formular mit @ Html.HiddenFor HTml-Hilfsmethode.Dann, wenn Sie das Formular abgesendet hat, werden Sie es in Ihrer Viewmode erhalten, die ein Parameter Ihrer Httppost ist Create-Methode

@model Note 

@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m=>m.NotDesc) 
    @Html.HiddenFor(m => m.WrittenFor) 
    <input type="submit" value="Create" /> 
} 

und in Ihrer Httppost Aktion-Methode, Sie haben, was Sie wollen

[HttpGet] 
public ActionResult Create(Note objNote) 
{ 
    int friendId= objNote.WrittenFor 
    string note=objNote.NoteDesc 
    //Now you can save your value 
} 
+0

Vielen Dank, Shyju. Mit ein wenig Feinabstimmung für den Guid-Typ hat das für mich funktioniert. –

0

Zulassen Für die Änderungen, die nötig waren, um den Typ Guid anstelle des Typs Int zu verwenden, gab Shyju mir die Antwort. Vielen Dank!

Verwandte Themen