I am creating a search page using ajax.
The scenario is: in our purchase system, user select the category from dropdownlist and then click browse button to show a modal form with a list of product based on selected category.
The problem is after the modal shown and then user fill criteria for searching and click Search, the categoryID is null. How to keep this value when we search data using ajax?
Below codes to represent what I've done so far:
Purchase View:
@using (Html.BeginForm("Create", "Invoice", FormMethod.Post, new { @enctype = "multipart/form-data" }))
{
@Html.LabelFor(model => model.CategoryID, new { @class = "control-label col-md-2" })
@Html.DropDownListFor(model => model.CategoryID, new SelectList(Model.Categories, "CategoryID", "Name"), "-- Please Select --", new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CategoryID)
@Html.LabelFor(model => model.ProductID, new { @class = "control-label col-md-2" })
@Html.HiddenFor(model => model.ProductID)
@Html.EditorFor(model => model.Product.Name, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
<button class="btn btn-primary" id="btnLookupProduct" data-id="@Model.CategoryID" data-toggle="modal" data-target="#myModal">Lookup Product</button>
}
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<h4 class="modal-title" id="myModalLabel">Product List</h4>
@using (Ajax.BeginForm("Search", "Product",
new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "lookup-timekeeper-container"
}))
{
@Html.DropDownList("FilterField",
new List<SelectListItem>
{
new SelectListItem { Text = "Code", Value = "Code" },
new SelectListItem { Text = "Name", Value = "Name" }
},
"-- Please Select --",
new { @class = "form-control" })
@Html.TextBox("FilterValue", null, new { @class = "form-control", @placeholder = "Enter keyword" })
<input type="submit" value="Search" class="btn btn-primary" />
}
</div>
<div class="modal-body" id="lookup-timekeeper-container">
// list of product
</div>
</div>
</div>
</div>
@section Scripts {
<script type="text/javascript">
$(document).ready(function () {
$("#btnLookupProduct").click(function () {
var url = '@Url.Content("~/Product/Search/")' + $("#CategoryID").val();
$.get(url)
.done(function (data) {
if (!data.message) {
$("#lookup-timekeeper-container").html(data);
$("#myModal").modal(show = true, backdrop = true);
} else {
alert(data.message);
}
});
});
});
</script>
}
Purchase Controller:
public ActionResult Search(int? id, string filterField, string filterValue)
{
var products = db.Products.Where(p => p.CategoryID == id);
if (!string.IsNullOrEmpty(filterValue))
{
products = products.Where(filterField + ".Contains(@0)", filterValue);
}
return PartialView("_Lookup", products.ToList());
}
Product Partial Page:
@model List<PurchaseSystem.Models.Product>
<div class="table-responsive">
<table class="table table-striped table-hover table-condensed">
<tr>
<th>Code</th>
<th>Name</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.Code)</td>
<td>@Html.DisplayFor(modelItem => item.Name)</td>
</tr>
}
</table>
</div>