Вот что я бы порекомендовал. Создайте div, который содержит динамическое содержимое, и поместите его в частичное представление. В этом случае будет частичное представление с именем Products.ascx
<div id="ProductsContent">
<% Html.RenderPartial("Products"); %>
</div>
Вызовите функцию javascript, когда установлен флажок категории.
<input id="Category_1" type="checkbox" onclick="CategoryCheckChanged(1)" />
<input id="Category_2" type="checkbox" onclick="CategoryCheckChanged(2)" />
<input id="Category_3" type="checkbox" onclick="CategoryCheckChanged(3)" />
используйте JQuery для определения значения флажка, а затем отправьте сообщение на сервер. В приведенном ниже примере имя моего контроллера называется Products. Информация, возвращаемая с сервера, является обновленным частичным представлением, которое заменяет содержимое div.
function CheckChanged(id)
{
var bChecked = $("#Category_"+id).attr("checked");
var value = 0;
if(bChecked) value=1;
$.post('<%= Url.Action("CategoryChanged","Products") %>'
, { value: value, categoryid: id }
, function(data) {
if (data.success) {
alert("Sweet !")
//update the div with the new content
$('#ProductsContent').html(data.newcontent);
}
else {
alert("Bummer:" + data.msg);
}
}, "json");
}
Вот функция CategoryChanged в ProductsController
[HttpPost]
public ActionResult CategoryChanged(int value, int id)
{
try
{
//Save the change to the database
SaveChangedCategoryValueToDatabase(id,value);
//Create your View Model
MyProductsViewModel vm = new MyProductsViewModel();
return Json(new { success = true, newcontent =
MyViewHelper.RenderPartialToString(this.ControllerContext,
"~/Views/Products/Products.ascx",
new ViewDataDictionary(vm), new TempDataDictionary()) });
}
catch(SystemException ex)
{
return Json(new { success = false, msg = ex.Message });
}
}
и, наконец ... Вспомогательная функция, которая выполняет частичное представление строки.
public static class MyViewHelper
{
public static string RenderPartialToString(ControllerContext context
, string partialViewName
, ViewDataDictionary viewData
, TempDataDictionary tempData)
{
ViewEngineResult result =
ViewEngines.Engines.FindPartialView(context, partialViewName);
if (result.View != null)
{
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter output = new HtmlTextWriter(sw))
{
ViewContext viewContext = new ViewContext(
context, result.View, viewData, tempData, output);
result.View.Render(viewContext, output);
}
}
return sb.ToString();
}
return String.Empty;
}
}