更新:私はまだ何も理解していません。それは確かにそれがそうであるように働くべきであるように思われます。
ビューモデルにバインドしたテレリックグリッドがあります。グリッドには基本的に、Vehicleオブジェクトの名前とタイプが表示されます。データキーに、VehicleIDフィールドとTimestampフィールドの両方を追加しました。グリッドがajax更新を投稿する場合、Timestampフィールドはnullです。
ビューに渡されるときに、ビューモデルのタイムスタンプフィールドに値があることを確認しました。
関連するコードは次のとおりです。
意見:
...
@(Html.Telerik().Grid(Model)
.Name("Grid")
.Columns(columns =>
{
columns.Bound(o => o.VehicleID).Visible(false);
columns.Bound(o => o.VehicleName);
columns.Bound(o => o.VehicleType);
})
.DataBinding(dataBinding =>
{
dataBinding.Server().Select("Index", "Vehicle");
dataBinding.Ajax().Select("_Index", "Vehicle").Enabled(true);
dataBinding.Ajax().Update("_SaveVehicle", "Vehicle");
dataBinding.Ajax().Delete("_DeleteVehicle", "Vehicle");
})
.Scrollable(scrolling => scrolling.Enabled(true))
.Sortable(sorting => sorting.Enabled(true))
.Pageable(paging =>
paging.Enabled(true)
.PageSize(20)
.Position(GridPagerPosition.Bottom))
.Filterable(filtering => filtering.Enabled(true))
.Groupable(grouping => grouping.Enabled(true))
.Footer(true)
.ToolBar(toolbar => toolbar.Template(
@<text>
@using (Html.BeginForm("ExportCsv", "Vehicle", FormMethod.Post, new {id = "export"}))
{
<text>
<input type="submit" value="Export to CSV" id="export" />
</text>
}
<label class="error">@ViewBag.AjaxErrorMessage</label>
</text>
))
.Columns(columns =>
{
columns.Command(command =>
{
command.Custom("details").Text("Details").Action("Edit", "Vehicle").HtmlAttributes(new { style = "text-align: center" }) ;
command.Edit().ButtonType(GridButtonType.Image);
command.Delete().ButtonType(GridButtonType.Image);
}).Width(165);
})
.DataKeys(dataKeys =>
{
dataKeys.Add(key => key.Timestamp).RouteKey("Timestamp");
dataKeys.Add(key => key.VehicleID).RouteKey("VehicleID");
})
.ClientEvents(events => events.OnEdit("onEdit"))
.ColumnContextMenu()
.Resizable(config =>
{
config.Columns(true);
})
.Reorderable(config =>
{
config.Columns(true);
})
)
<script type = "text/javascript">
function onEdit(e) {
$(e.form).find('#VehicleType').data('tDropDownList').select(function (dataItem) {
return dataItem.Text == e.dataItem['vehicleType'];
});
}
</script>
モデルの表示:
using System;
using System.ComponentModel.DataAnnotations;
namespace ShopLog.ViewModels
{
public class VehicleIndexViewModel
{
//public IEnumerable<Vehicle> Vehicles { get; set; }
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid VehicleID { get; set; }
[Timestamp]
public Byte[] Timestamp { get; set; }
[Required]
[Display(Name = "Vehicle Name")]
[MaxLength(30, ErrorMessage = "The {0} must be no more than {2} characters long.")]
public string VehicleName { get; set; }
[Display(Name = "Fuel Type")]
[StringLength(30, ErrorMessage = "\"{0}\" must be no more than {1} characters long.")]
public string FuelType { get; set; }
[Display(Name = "Notes")]
[DataType(DataType.MultilineText)]
public string Notes { get; set; }
[UIHint("VehicleType")]
[Display(Name = "Type")]
public string VehicleType { get; set; }
[Display(Name = "Transmission Type")]
public String TransmissionType { get; set; }
}
}
更新用のコントローラーの郵便番号 最初の行にブレークポイントを設定すると、VehicleIndexViewModelのタイムスタンププロパティがnullになります。フォームコレクションからタイムスタンプを取得しようとしましたが、そこでもnullです。
[AcceptVerbs(HttpVerbs.Post)]
[GridAction]
public ActionResult _SaveVehicle(VehicleIndexViewModel vehicleIndexViewModel, FormCollection formcollection)
{
if (TryUpdateModel(vehicle))
{
try
{
//Delete the record
db.Entry(vehicle).State = EntityState.Modified;
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
ViewBag.AjaxErrorMessage = "That record has been edited by someone else since you started editing it.";
}
catch (DataException)
{
ViewBag.AjaxErrorMessage = "Error saving data, please try again.";
}
}
//Rebind the grid
PopulateVehicleTypes();
return View(new GridModel(GetIndexViewData()));
}
ありがとう!