MVC jqgrid - не удается заставить привязку модели работать, чтобы редактировать объект для обновления ячейки
Я использую JQGrid для редактирования сетки данных. Я хочу отправить данные в ячейку для редактирования на сервере. Так выглядит мой взгляд;
@using Lib.Web.Mvc.JQuery.JqGrid
@using Tac.P3.Model
@model ContractType
@{
ViewBag.Title = "List of Contract Types";
var grid = new JqGridHelper<ContractType>(
"ContractTypes",
dataType: JqGridDataTypes.Json,
methodType: JqGridMethodTypes.Post,
pager: true,
rowsNumbers: true,
rowsNumber: 20,
shrinkToFit: true,
cellEditingEnabled: true,
cellEditingSubmitMode: JqGridCellEditingSubmitModes.Remote,
cellEditingUrl:Url.Action("Update", "ContractType"),
sortingName: "ContractTypeLabel", sortingOrder: JqGridSortingOrders.Asc,
url: Url.Action("GridData"),
viewRecords: true)
.Navigator(new JqGridNavigatorOptions()
{
Add = false,
Edit = false,
Delete = false,
Search = false
});
}
<div class="mainPage">
<fieldset>
<legend>Add New Contract Type</legend>
<form class="form-horizontal" method="POST" action="@Url.Action("Add")">
<div class="form-group">
<div class="col-xs-1">@Html.LabelFor(model => model.ContractTypeLabel)</div>
<div class="col-xs-10">@Html.TextBoxFor(model => model.ContractTypeLabel)</div>
</div>
<div class="form-group">
<div class="col-xs-1">@Html.LabelFor(model => model.Description)</div>
<div class="col-xs-10">@Html.TextBoxFor(model => model.Description)</div>
</div>
<div class="form-group">
<div class="col-xs-offset-1 col-xs-10">
<button class="btn btn-primary" id="btnSubmitForm">Add</button>
</div>
</div>
</form>
</fieldset>
<fieldset>
<legend>List of Contract Types</legend>
@Html.Partial("_Messages")
<div id="loadingMessage" class="errorHighlight">Loading list of Contract Types, please wait...</div>
@grid.GetHtml()
</fieldset>
</div>
Мой метод на контроллере выглядит так
public ActionResult Update(CellEditingViewModel viewModel)
{
var contractType = this.TacUoW.ContractType.GetById(viewModel.Id);
switch (viewModel.PropertyName)
{
case "ContractTypeLabel":
contractType.ContractTypeLabel = viewModel.PropertyValue.ToString();
break;
case "Description":
contractType.Description = viewModel.PropertyValue.ToString();
break;
}
this.TacUoW.ContractType.Update(contractType);
this.TacUoW.SaveChanges();
return this.Json(true);
}
Моя модель зрения выглядит так;
[ModelBinder(typeof(CellEditingViewModelBinder))]
public class CellEditingViewModel
{
public int Id { get; set; }
public string PropertyName { get; set; }
public object PropertyValue { get; set; }
}
Мой ModelBinder выглядит так;
public class CellEditingViewModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var model = new CellEditingViewModel { Id = Convert.ToInt32(request.Params["ContractTypeId"]) };
if (request.Params.AllKeys.Contains("ContractTypeLabel"))
{
model.PropertyName = "ContractTypeLabel";
model.PropertyValue = request.Params["ContractTypeLabel"];
}
else if (request.Params.AllKeys.Contains("Description"))
{
model.PropertyName = "Description";
model.PropertyValue = request.Params["Description"];
}
return model;
}
}
Когда я нажимаю в сетке передачу, я получаю пустой объект, отправленный методу контроллера, привязка модели не происходит. Что я делаю неправильно?
1 ответ
Решение
Я нашел, в чем проблема, и я не опубликовал весь код, чтобы показать это. Для моего класса CellEditingViewModel я использовал
using System.Web.Http.ModelBinding;
Что не так. Я должен был использовать
using System.Web.Mvc;