2013-03-02 3 views
0

Сетка и всплывающие окна работают отлично, за исключением значений, вводимых в режиме создания, не передаются обратно на контроллер. При взгляде на консоль JS нет ошибок. Мониторинг процесса создания в Fiddler также не показывает никаких значений, хотя мои элементы формы показывают.Kendo UI PopUp не передает значения контроллеру

При отладке модель в моем контроллере пуста.

Вот определение сетки:

@(Html.Kendo().Grid<MyApp.Domain.Entities.TaktInterruptionViewModel>() 
.Name("Interruptions") 
.Columns(columns => 
    { 
     columns.Bound(i => i.TaktInterruptionId).Hidden().IncludeInMenu(false); 
     columns.Bound(i => i.DateCreated).Title("Date").Width(75).Format("{0:d}"); 
     columns.Bound(i => i.ActionCount).Title("Actions").Width(50).Hidden(true); 
     columns.Bound(i => i.MeetingType).Title("Meeting Type").Width(100).Hidden(true); 
     columns.Bound(i => i.AreaName); 
     columns.Bound(i => i.TypeName); 
     columns.Bound(i => i.Responsible); 
     columns.Bound(i => i.Description).Width(300); 
     columns.Bound(i => i.Interruption).Width(75).Hidden(true); 
     columns.Bound(i => i.TaktMissed).Title("Missed").Width(75); 
    }) 
.ClientDetailTemplateId("ActionsTemplate") 
.ToolBar(toolbar => toolbar.Create().Text("Add Interruption")) 
.Editable(edit => edit.Mode(GridEditMode.PopUp).TemplateName("Create").Window(w => w.Title("Interruption").Name("addInterruption").Modal(true))) 
.DataSource(datasource => datasource.Ajax() 
    .Model(model => model.Id(p => p.TaktInterruptionId)) 
    .ServerOperation(false) 
    .PageSize(5) 
    .Create(create => create.Action("Create", "Home")) 
    .Read(read => read.Action("GetInterruptions", "Home"))) 
.Groupable() 
.Pageable() 
.Sortable() 
.Filterable() 
.ColumnMenu() 
.Selectable(s => s.Mode(GridSelectionMode.Multiple)) 
.Reorderable(reorder => reorder.Columns(true)) 
.Resizable(resize => resize.Columns(true)) 
.Events(events => events.Change("displayChart")) 
) 

Моя создать шаблон редактора выглядит следующим образом:

@model MyApp.Domain.Entities.TaktInterruptionViewModel 
@{ 
    ViewBag.Title = "Index"; 
} 

<div class="span-14" style="padding: 10px;"> 
    @Html.ValidationSummary(true) 
    <hr class="space" /> 
    <div> 
     @Html.LabelFor(model => model.DateCreated)<br /> 
     @(Html.Kendo().DatePicker().Name("DateCreated").Value(DateTime.Today)) 
     <br /> 
     @Html.ValidationMessageFor(model => model.DateCreated, null, new { style = "color:red;" }) 
    </div> 
    <hr class="space" /> 
    <div class="span-7"> 
     @Html.LabelFor(model => model.AreaId)<br /> 
     @(Html.Kendo().DropDownListFor(model => model.AreaId) 
      .Name("AreaId") 
      .HtmlAttributes(new { style = "width:200px" }) 
      .OptionLabel("Select Area...") 
      .DataTextField("AreaName") 
      .DataValueField("AreaId") 
      .DataSource(source => 
       { 
        source.Read(read => 
         { 
          read.Action("GetAreas", "Area"); 
         }); 
       }) 
     ) 
     <br /> 
     @Html.ValidationMessageFor(model => model.AreaId) 
    </div> 
    <div class="span-6"> 
     @Html.LabelFor(model => model.TaktInterruptionTypeId)<br /> 
     @(Html.Kendo().DropDownListFor(model => model.TaktInterruptionTypeId) 
      .Name("TaktInterruptionTypeId") 
      .HtmlAttributes(new { style = "width: 200px" }) 
      .OptionLabel("Select Type...") 
      .DataTextField("TypeName") 
      .DataValueField("TaktInterruptionTypeId") 
      .DataSource(source => 
       { 
        source.Read(read => 
         { 
          read.Action("GetTypes", "Area").Data("filterTypes"); 
         }).ServerFiltering(true); 
       }) 
       .Enable(false) 
       .AutoBind(false) 
       .CascadeFrom("AreaId") 
     ) 
     <br /> 
     @Html.ValidationMessageFor(model => model.TaktInterruptionTypeId, null, new { style = "color:red;" }) 
    </div> 
    <hr class="space" /> 
    <div class="span-11"> 
     @Html.LabelFor(model => model.Description)<br /> 
     @Html.TextAreaFor(model => model.Description, new { @class = "multi-line" }) 
     <br /> 
     @Html.ValidationMessageFor(model => model.Description, null, new { style = "color:red;" }) 
    </div> 
    <hr class="space" /> 
    <div class="span-5"> 
     @Html.LabelFor(model => model.Interruption)<br /> 
     @(Html.Kendo().NumericTextBox().Name("Interruption").Format("#.0").Value(0)) 
     <br /> 
     @Html.ValidationMessageFor(model => model.Interruption) 
    </div> 
    <div class="span-6"> 
     @Html.LabelFor(model => model.TaktMissed)<br /> 
     @(Html.Kendo().NumericTextBox().Name("TaktMissed").Format("#.0").Value(0)) 
     <br /> 
     @Html.ValidationMessageFor(model => model.TaktMissed) 
    </div> 
    <hr class="space" /> 
    <div> 
     @Html.LabelFor(model => model.Responsible)<br /> 
     @Html.EditorFor(model => model.Responsible, new { @class = "k-input k-textbox" }) 
     <br /> 
     @Html.ValidationMessageFor(model => model.Responsible, null, new { style = "color:red;" }) 
    </div> 
    <hr class="space" /> 
    <hr class="space" /> 
</div> 

<script type="text/javascript"> 
    function filterTypes() { 
     return { 
     AreaID: $("#AreaId").val() 
     }; 
    } 
</script> 

И мой контроллер создать метод:

[HttpPost] 
    public ActionResult Create([DataSourceRequest] DataSourceRequest request, MyApp.Domain.Entities.TaktInterruptionViewModel taktInterruption) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       // code removed for brevity 
      } 

      return Json(ModelState.ToDataSourceResult()); 
     } 
     catch(Exception ex) 
     { 
      TempData["message"] = "There was a problem saving the takt interruption.\n" + ex.Message; 
      return View(); 
     } 
    } 

Если удалить мой редактор шаблон из уравнения и разрешить кендо делать всплывающее окно, информация передается моему контроллеру ; однако я хочу контролировать макет всплывающего окна, и у меня также есть каскадные выпадающие списки (которые работают), поэтому шаблон редактора.

Мой вопрос: почему мои значения не введены во всплывающее окно, которое передается моему контроллеру?

+0

Кто-нибудь? Конечно, кто-то это делал раньше. Я действительно застрял и нуждаюсь в помощи здесь. Спасибо! – SFAgitator

ответ

1

Я не знаю, является ли это ошибкой или ограничением использования настраиваемого шаблона редактора, однако, чтобы обойти это, я подписался на событие редактирования JavaScript и установил значение выпадающего списка.

function reassignVacancy_Editing(e) 
{ 
    e.preventDefault(); 

    var reassignUserList = $("#reassignUserList").data("kendoComboBox"); 

    reassignUserList.value(e.model.UserId); 
} 

Я также нужно обрабатывать событие сохранить и обновить модель:

function reassignVacancy_Saving(e) 
    { 
     // Update the ViewModel 

     var reassignUserList = $("#reassignUserList").data("kendoComboBox"); 

     e.model.UserName = reassignUserList.dataItem().FullName; // For the benefit of the grid 
     e.model.UserId = reassignUserList.dataItem().Id;    
    } 

Надеется, что это помогает!

1

kendo pop up редактировать, принимать значения из сетки не шаблон, когда вы вводите значение, шаблон изменяет ячейку новой строки. Например,

@(Html.Kendo().DatePicker().Name("DateCreated").Value(DateTime.Today)) 
@(Html.Kendo().NumericTextBox().Name("TaktMissed").Format("#.0").Value(0)) 

Они имеют значение по умолчанию. Если вы не измените свои значения, они не будут отправлены на контроллер. Для публикации вам нужно записать значения в ячейку сетки.

var firstItem = $('#GridName').data().kendoGrid.dataSource.data()[0]; 
    firstItem.set('ColumnName', DefaultValue); 
+0

Я застрял на этом в течение 2 часов. Благодаря! – MattParra

Смежные вопросы