2012-04-11 61 views
1

更新:我還沒有想出任何東西。它肯定似乎應該按照它的方式工作。MVC 3 Telerik Grid不會返回視圖模型的時間戳

我有一個telerik網格,我已經綁定到視圖模型。網格基本上顯示了Vehicle對象的名稱和類型。在數據鍵中,我添加了VehicleID和Timestamp字段。當網格發佈ajax更新時,時間戳字段爲空。

我已驗證視圖模型中的時間戳字段在傳遞給視圖時有一個值。

下面是相關代碼:

查看:

... 
@(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; } 
    } 
} 

控制器郵編爲更新 在把斷點第一行顯示了th e vehicleIndexViewModel的timestamp屬性爲null。我試圖從formcollection中獲取Timestamp,但它在那裏也是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())); 
    } 

謝謝!

回答

1

這是我想通了:

的byte []不通過從視圖模型回來好。爲什麼?我不知道。

我最終使我的ViewModel中的「時間戳」字段成爲字符串而不是字節[]。當我將數據從模型傳遞給ViewModel時,我稱之爲「Convert.ToBase64String(value)」。當我將數據從ViewModel傳遞迴模型時,請調用「Convert.FromBase64String(value)」。

型號:

[Timestamp] 
public Byte[] Timestamp { get; set; } 

視圖模型:

[Timestamp] 
public string Timestamp {get; set;} 

控制器:

[AcceptVerbs(HttpVerbs.Post)] 
    [GridAction] 
    public ActionResult _SaveVehicle(VehicleIndexViewModel vehicleIndexViewModel) 
    { 
     Vehicle vehicle = Mapper.Map<VehicleIndexViewModel, Vehicle>(vehicleIndexViewModel); 

     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())); 
    } 

在Global.ascx

Automapper映射
AutoMapper.Mapper.CreateMap<ShopLog.Models.Vehicle, ShopLog.ViewModels.VehicleIndexViewModel>().ForMember(m => m.Timestamp, opt => opt.ResolveUsing<VehicleTimestampResolver>()); 
AutoMapper.Mapper.CreateMap<ShopLog.ViewModels.VehicleIndexViewModel, ShopLog.Models.Vehicle>().ForMember(m => m.Timestamp, opt => opt.ResolveUsing<VehicleIndexViewModelTimestampResolver>()); 

    public class VehicleTimestampResolver : AutoMapper.ValueResolver<Vehicle, string> 
    { 
     protected override string ResolveCore(Vehicle source) 
     { 
      return Convert.ToBase64String(source.Timestamp); 
     } 
    } 

    public class VehicleIndexViewModelTimestampResolver : AutoMapper.ValueResolver<ShopLog.ViewModels.VehicleIndexViewModel, byte[]> 
    { 
     protected override byte[] ResolveCore(ShopLog.ViewModels.VehicleIndexViewModel source) 
     { 
      return Convert.FromBase64String(source.Timestamp); 
     } 
    } 

查看:(注datakeys)

@(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) 
     .OrderBy(sortOrder => sortOrder.Add(o => o.VehicleName).Ascending()) 
     .SortMode(GridSortMode.MultipleColumn)) 
    .Pageable(paging => 
     paging.Enabled(true) 
     .PageSize(20) 
     .Position(GridPagerPosition.Bottom)) 
    .Filterable(filtering => filtering.Enabled(true)) 
    .Groupable(grouping => grouping.Enabled(true)) 
    .Footer(true) 
    .ToolBar(commands => commands 
     .Custom() 
      .HtmlAttributes(new {id = "export"}) 
      .Text("Export to CSV") 
       .Action("ExportCsv", "Vehicle", new { page = 1, orderBy = "~", filter = "~" }))              
    .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") 
     .OnDataBound("onDataBound")) 
    .ColumnContextMenu() 
    .Resizable(config => 
     { 
      config.Columns(true); 
     }) 
    .Reorderable(config => 
     { 
      config.Columns(true); 
     })   
) 

從這個唯一剩下的事情就是找出其中顯示「ViewBag.AjaxErrorMessage」,當它返回到視圖,但不應該蜂太硬。 :)