2014-05-01 21 views
9

Thông thường tôi làm rất ít công việc trên mặt html của ứng dụng vì phần lớn tôi chỉ cho phép tạo ra cho tôi.Ràng buộc dữ liệu trong các giá trị MVC 5 và Select2 Mutiple với dao cạo

Tôi đang làm việc trên một ứng dụng cho một blog có Thẻ bài và Nhận xét. Những gì tôi muốn làm là khi tạo một bài đăng mới, tôi sẽ có thể thêm các thẻ hiện có vào bài đăng mới. Tôi đang cố gắng sử dụng Select2 nhưng tôi không thể tìm ra cách để làm cho các giá trị đã chọn được chuyển đến phương thức Create của tôi trong bộ điều khiển bài để chúng có thể được lưu trữ trong cơ sở dữ liệu.

Dưới đây là những gì tôi đang làm việc với:

namespace Blog.Data.Entities 
{ 
    public class Post 
    { 
     public virtual long PostId { get; set; } 

     ------------------- 

     public virtual ICollection<Tag> Tags { get; set; } 
    } 

    public class Tag 
    { 
     public virtual long TagId { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string Description { get; set; } 
    } 
} 

bài viết khiển

// POST: /Post/Create 
    [HttpPost] 
    public ActionResult Create(PostsCreateViewModel postModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Post post = new Post 
      { 
       Title = postModel.Title, 
       Body = postModel.Body, 
       PostDate = _dateTime.UtcNow 
      }; 

      foreach (var tag in postModel.Tags) 
      { 
       post.Tags.Add(_tagRepository.GetTag(tag.TagId)); 
      } 

      _postRepository.SavePost(post); 

      return RedirectToAction("Detail"); 
     } 
     return View(postModel); 
    } 

Tôi thành công có thể tải dữ liệu từ xa với: Json đang rời ra

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#tags").select2(
     { 
      placeholder: "Select a Tag", 
      minimumInputLength: 1, 
      multiple: true, 
      maximumSelectionSize: 5, 
      ajax: { 
       url: '@Url.Action("SearchTag", "Post")', 
       dataType: 'json', 
       data: function (term, page) { 
        return { 
         searchTerm: term, 
         page_limit: 10, 
         page: page, 
        }; 
       }, 
       results: function (data, page) { 
        var more = (page * 10) < data.total; 
        return { results: data, more: more }; 
       } 
      } 
     }); 
    }); 
</script> 

Xem: thường tôi sẽ có một cái gì đó giống như

<div class="form-group"> 
      @Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Title) 
       @Html.ValidationMessageFor(model => model.Title) 
      </div> 
     </div> 

Làm thế nào tôi có thể viết html tương tự cho thẻ textbox tôi, vì vậy mà khi tôi nhấp vào lưu tất cả mọi thứ sẽ được lưu vào bảng phù hợp?

Hiện nay tôi chỉ có điều này cho Select2:

<div class="form-group"> 
    @Html.LabelFor(model => model.Tags, new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     <input id="tags" style="width: 300px" /> 
     @Html.ValidationMessageFor(model => model.Tags) 
    </div> 
</div> 

nào sản xuất;

enter image description here

+0

Không phải là ' select2' muti-select items chỉ là các chuỗi được phân tách bằng dấu phẩy? Bạn không thể lưu trữ thêm thông tin trong đó mà không cần chỉnh sửa 'select2'. Khi tôi đã sử dụng điều này trong quá khứ tôi đã chỉ cần chia 'chuỗi' được đăng .. và đẩy nó vào một bảng' Tags'. –

+1

@SimonWhitehead tôi không tạo thẻ, tôi đang kéo chúng từ xa và tôi không gặp vấn đề gì với điều này. Tôi muốn chỉ định các thẻ đã chọn cho 'Post.Tags' – Komengem

+0

Right .. nhưng' Tag' trong cơ sở mã của bạn có 'Name' và' Description'. Đây là thông tin nhiều hơn 'select2' multi-select cung cấp .. mà không cần chỉnh sửa thủ công nó. Đặt cược tốt nhất của bạn là đồng bộ tất cả các thẻ từ xa với bảng cơ sở dữ liệu 'Thẻ' cục bộ. Sau đó, bạn có thể ít nhất là khớp với chuỗi 'select2' cho bạn chống lại thẻ' Tên' trong bảng thẻ. Tôi có ý nghĩa gì không (hy vọng tôi là)? –

Trả lời

0

tôi nghĩ rằng nó chỉ giống như một <select multiple>
ví dụ

<select name="abc" multiple> 
     <option value=1>a</option> 
     <option value=2>b</option> 
     <option value=3>c</option> 
     <option value=4>d</option> 
    </select> 

bạn chọn tùy chọn a và tùy chọn b thì mẫu với bài phương pháp
dữ liệu bài sẽ
nộp abc 1
abc 2
và bạn có thể lấy dữ liệu bằng mvc acti trên với một param như IEnumeralbe<int> abc

hành động sẽ thích

public ActionResult ActionName(IEnumerable<int> abc) 

các Select2 cắm duy nhất thay đổi quan điểm, bưu dữ liệu cũng sử dụng một bài http

0

gì tôi đề nghị được làm như sau:

  • trước tiên: giữ hộp văn bản của thẻ chỉ để hiển thị.

  • giây: có các đầu vào bị ẩn được đồng bộ hóa với các giá trị hộp văn bản bằng cách thao tác giá trị của nó trong javascript. mỗi thẻ trong hộp văn bản sẽ có đầu vào bị ẩn các đầu vào bị ẩn sẽ đại diện cho các Id thẻ được chọn và hiển thị trong hộp văn bản.

lợi ích từ cách này là mặc định mô hình chất kết dính sẽ chăm sóc ràng buộc đầu vào giá trị tiềm ẩn đối với tài sản xem mô hình của bạn: [công ICollection ảo Thẻ {get; bộ; }]

để biết làm thế nào đầu vào ẩn sẽ giống như trong html của bạn:

<input type="hidden" name="Tags[0].TagId" value="1" /> 
<input type="hidden" name="Tags[1].TagId" value="2" /> 
<input type="hidden" name="Tags[2].TagId" value="3" /> 

để biết thêm về danh sách ràng buộc chỉ cần làm theo các liên kết:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

+0

hãy để tôi làm rõ rằng bạn phải thay đổi id textbox = "tags" thành một cái gì đó khác. –

Các vấn đề liên quan