2013-06-04 45 views
4

我有一個mysql數據庫,包括表格「交付成果」,「標籤」和「交付物品標籤」。我想將標籤鏈接到交付物。ASP.NET MVC:保存自動完成的多個值

這是我做我的JavaScript文件:

<script type="text/javascript" language="javascript"> 
    $(function() { 
     var object = {}; 
     $.ajax({ 
      type: "GET", 
      url: "/Deliverable/Tags", 
      dataType: "json", 
      success: function (data) { 
       object.tags = data; 
      } 
     }); 

     function split(val) { 
      return val.split(/,\s*/); 
     } 
     function extractLast(term) { 
      return split(term).pop(); 
     } 
     $("#tags") 
     // don't navigate away from the field on tab when selecting an item 
      .bind("keydown", function (event) { 
       if (event.keyCode === $.ui.keyCode.TAB && 
       $(this).data("ui-autocomplete").menu.active) { 
        event.preventDefault(); 
       } 
      }) 

.autocomplete({ 
    minLength: 0, 
    source: function (request, response) { 
     // delegate back to autocomplete, but extract the last term 
     response($.ui.autocomplete.filter(
object.tags, extractLast(request.term))); 
    }, 
    focus: function() { 
     // prevent value inserted on focus 
     return false; 
    }, 
    select: function (event, ui) { 
     var terms = split(this.value); 
     // remove the current input 
     terms.pop(); 
     // add the selected item 
     terms.push(ui.item.value); 
     // add placeholder to get the comma-and-space at the end 
     terms.push(""); 
     this.value = terms.join(", "); 

     return false; 
    } 
}); 
    }); 
</script> 

我可以在我的文本框添加多個標籤。

但現在我想將其保存在我的存儲庫中。 在我的操作方法控制:

repository.AddDeliverable(model.Title, model.Description, model.UsernameID, data, datatwo, model.VideoUrl, model.AfstudeerrichtingID, model.ProjectID); 

標籤動作:

public JsonResult Tags() 
{ 
    var data = (repository.GetTags()).ToArray(); 

    return Json(data, JsonRequestBehavior.AllowGet); 
} 

在我的倉庫:

public IQueryable<string> GetTags() 
{ 
    return from tag in entities.tags 
      orderby tag.tag_name 
      select tag.tag_name; 
} 

我不知道如何保存這在我的數據庫。
任何人都可以幫助我嗎?

+0

有到模型綁定'serializeArray()''d集合的方式,請參見[http://stackoverflow.com/questions/4402036/jquery-ajax-posting-array-to-asp-net -mvc控制器/ 4402080#4402080](http://stackoverflow.com/questions/4402036/jquery-ajax-posting-array-to-asp-net-mvc-controller/4402080#4402080) – OzrenTkalcecKrznaric

回答

2

如果我理解正確你的問題,你已經實現了你的變量處理如下:

  1. 存在與不包含數據
  2. 佔位符本身輸入佔位符返回視圖MVC操作方法可能是input type=text在'準備就緒'的時候,你發起ajax請求來從數據庫中檢索你的標籤,將json-serialized作爲數組;當它到達你把它存儲到tags變量(沒有錯誤處理(!))
  3. 同時你裝飾與反作用於用戶輸入和可變
  4. 由於輸入已經包含了標籤返回的項目jQueryUI的自動完成您的輸入標籤(逗號分隔),你的過濾器是最後一個標籤的第一個字母

所以,你有一種情況,當用戶輸入幾個逗號分隔標籤(可能其中一些可能是新的),現在想保存它到數據庫。對於每個輸入,如果這是已知的標籤,則必須將其存儲到「deliverables_has_tags」。如果有新標籤,則必須將其存儲到「標籤」和「交付品_標籤」中。

最常見的情況是有一個'保存'按鈕來開始保存過程。我們來分析一下你在這個過程中要做什麼。

1)按鈕點擊

在按鈕單擊用js使用邏輯轉換您的逗號分隔標籤串 像split(term)到數組中,並對其進行序列化。您可以使用serializeArray做 序列化並手動創建JSON 對象,或使用 $('#yourForm').serialize()將整個表單序列化。我會選擇第一個選項 ,因爲這樣我可以更好地控制JSON格式並避免使用MVC默認模型綁定的 問題。

2)Ajax調用

當JSON對象是準備發送,你火了ajax POST 請求你的MVC POST操作方法。當您始終保存狀態 避免GET,因爲新版本的瀏覽器可以掃描您的頁面,並且 使用GET請求主動預先加載URL。你不想在這裏。 當然,在ajax調用中使用你的數據作爲數據參數。

3)操作方法

當請求到達時,你必須使用一個新的操作方法來處理它在你的控制器 。通常在這種情況下,您將有 類似public JsonResult SaveTags(SaveTagsModel saveTags) { ... }這樣可以使用您的存儲庫保存標記,並返回結果 說「OK」或「ERROR」(如 response.isSaved = true/false)。棘手的部分可以根據你的JSON對象設計視圖模型 - this可以提供幫助。而關於 集合this可能是有價值的信息。

保存時,請使用事務來確保一次保存所有內容。 首先檢查每個標籤是否存在於數據庫中,並插入那些不存在的人。之後,檢查每個標記,如果在deliverables_has_tags中存在適當的 n-n關係並且如果沒有則插入它。 我相信你應該對 操作使用相同的資源庫封裝。

1

在發佈操作中,將FormCollection集合作爲參數包含並從中收集您的標籤。沒有自動的方式。你可以實現一些自定義模型綁定,但這可能是不值得的。