Usually I do very little work on html side of the application because for the most part I just let that get generated for me.
I am working on an app for a blog with Posts Tags and Comments. What I want to do is when creating a new post, I should be able to add existing tags to the new post. I am trying to use Select2 but I can't figure out how to make the selected values passed to my Create method in the post controller so that they can be stored in the database.
Here is what I am working with:
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; }
}
}
Post Controller
// 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);
}
I am successfully able to load data from remote with: Json code left out
<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>
View: usually I would have something like
<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>
How can I write similar html for my tag textbox, so that when I click save everything is saved to appropriate tables?
Currently I just have this for 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>
Which produces;
select2
muti-select items just comma separated strings? You're unlikely to be able to store more information in them without editingselect2
itself. When I have used this in the past I have just split thestring
that is posted.. and pushed it into aTags
table. – EnergidPost.Tags
– DysphasiaTag
in your code base has aName
andDescription
. This is more information than theselect2
multi-select provides.. without you manually editing it. Your best bet is to sync all of the remote tags to a localTags
database table. Then you can at least match the string thatselect2
gives you against the tagName
in the tag table. Am I making any sense (hopefully I am)? – Energidint[] SelectedTags
and use@Html.TextboxFor(m => m.SelectedTags)
and change the script to$('#SelectedTags').select2(...
. Your current input does not have a name attribute so wont post back anything. – Gentlemanly