0

Ich habe ein Objekt class Tag {string Key; string Text;} und ein Objekt Record, das an eine Speichertabelle gebunden ist.MVC Bindung an eine transformierte Eigenschaft

class Record { [...Id & other properties...] 
    public string Name { get; set; } // "FirstRecord" 
    public string Tags { get; set; } // "3,4,9" 
} 

Die Aktualisierung der Name ist kein Problem. Aber ich habe einige Schwierigkeiten mit der Tags ... Wie Sie sehen können, ist die Tags Eigenschaft die CSV von int Schlüsseln (sagen Sie {1:".net",2:"java",3:"perl" ...}).

In der Record ‚s Bearbeiten Ansicht bauen ein Wörterbuch mit allen verfügbaren Stichworte:

Dictionary<string, string> tags = ViewData["tags"] as Dictionary<string, string>; 
[...] 
<div class="form-group"> 
    <label class="col-md-2 control-label">Tags</label> 
    <div class="col-md-10"> 
     @foreach (var tag in tags) 
     { 
      <div class="checkbox-inline"> 
       <label for="[email protected]"> 
        <input type="checkbox" id="[email protected]" value="@tag.Key" /> 
        @tag.Value 
       </label> 
      </div> 
     } 
    </div> 
</div> 

Und schließlich ich die Edit Post-Controller haben, wie diese

// POST: Records/Edit/5 
[HttpPost, ValidateAntiForgeryToken] 
public async Task<IActionResult> Edit(string id, [Bind("Id,Name")] Record record) 
{ 
    if (id != record.Id) { 
     return NotFound(); 
    } 

    if (ModelState.IsValid) { 
     try { 
      await repository.UpdateTableEntityAsync(record); 
     } 
     catch (Exception) { [...] } 

     return RedirectToAction("Index"); 
    } 
    return View(record); 
} 

Also, ich Bin verwirrt, wenn ich Tags, wie [Bind("Id,Name,Tags")] binden sollte, weil dieser Wert aus allen überprüften Checkbox-Werten genommen werden sollte, dann verkettet als CSV, um bereit zu sein, in den s aktualisiert zu werden ...

+0

Speichern Sie Ihre Tags als csv ist eine schlechte Praxis - siehe (https://stackoverflow.com/questions/3653462/is-storing-a [Ist in einer Datenbankspalte wirklich so schlecht eine begrenzte Liste speichern?] -limited-list-in-einer-Datenbank-column-really-that-bad) - und Sie sollten eine separate Tabelle mit einer Navigationseigenschaft haben. Aber was die Ansicht betrifft, sollten Sie Ansichtsmodelle für Ihre Ansicht erstellen, ähnlich wie [diese Antwort] (https://stackoverflow.com/questions/29542107/pass-list-of-checkboxes-into-view-view- und-herausziehen-ienumerable/29554416 # 29554416) –

Antwort

0

Wenn Sie die Kontrollkästchenwerte an eine Zeichenfolge binden möchten, können Sie alle Werte der Kontrollkästchen abrufen und den Wert des Modells manuell festlegen. Code unten ist für Ihre Referenz.

Fügen Sie in Sicht eine Namenseigenschaft für das Kontrollkästchen hinzu.

In Aktion könnten wir alle Werte der Checkbox mit Request.Form bekommen.

[HttpPost, ValidateAntiForgeryToken] 
public async Task<IActionResult> Edit(string id, [Bind("Id,Name")] Record record) 
{ 
    if (id != record.Id) 
    { 
     return NotFound(); 
    } 

    record.Tags = ""; 
    foreach (var key in Request.Form.AllKeys) 
    { 
     if (key.StartsWith("tag_")) 
     { 
      record.Tags += Request.Form[key] + ","; 
     } 
    } 
    if (record.Tags.Length > 0) 
    { 
     record.Tags = record.Tags.Remove(record.Tags.Length - 1, 1); 
    } 

    if (ModelState.IsValid) 
    { 
     try 
     { 
      await repository.UpdateTableEntityAsync(record); 
     } 
     catch (Exception) 
     { 
     } 

     return RedirectToAction("Index"); 
    } 
    return View(record); 
} 
Verwandte Themen