2013-01-03 2 views
0

Введение:как отправить текущую модель с точки зрения UIHint

У меня есть сетка с полем Called значение и что поле может быть отредактирован пользователем.

В моей модели у меня есть IEnumerable List with PossibleValues, в случае, если Возможные значения = Пустой, когда пользователи пытаются отредактировать (значение поля в сетке). Я должен отображать текстовое поле по умолчанию, но если параметр ValueValues ​​имеет значения, я буду должны показать DropDownList со всеми возможными значениями.

Проблема:

Использование UIHint в режиме редактирования можно отобразить DROPDOWNLIST, но я не знаю, как передать текущую модель в Overrieded View ...

Кодекс :

Модель:

public class FamilyParameter 
{ 
    public FamilyParameter() 
    { 
     PossibleValues = new List<string>(); 
    } 

    [DisplayName("Value")] 
    [UIHint("_FamilyParameterValue")] 
    public string Value { get; set; } 

    public IEnumerable<string> PossibleValues { get; set; } 

    } 
} 

Вид: Общий/EditorTemplates/_FamilyParameterValue.cshtml

@model Bpt.Domain.FamilyParameter 
@Html.Telerik().DropDownList().Name("demo"); 

Вид: Основное

<div style="height:270px" > 
    <table> 
     <tr> 
      <td width="100%"> 
       <br /> 

       @(Html.Telerik().Grid<FamilyParameter>() 
        .Name("GridParam") 
        .DataKeys(keys => keys.Add(param => param.Code)) 
        .HtmlAttributes(new { style = "width: 420px;" }) 
        .NoRecordsTemplate("No existen resultados...") 
        .DataBinding(
         dataBinding => dataBinding.Ajax() 
          .Select("_EditMaterial_SelectParameters", Controllers.Valoration,Model) 
          .Update("_EditMaterial_UpdateParameters", Controllers.Valoration,Model) 
         ) 
        .Columns(columns => 
        { 
         columns.Bound(param => param.Code).Width("75px").HtmlAttributes(new { style = "text-align: left;" }).ReadOnly(); 
         columns.Bound(param => param.Description).Width("200px").HtmlAttributes(new { style = "text-align: left;" }).ReadOnly(); 
         columns.Bound(param => param.Value).Width("65px").HtmlAttributes(new { style = "text-align: left;" }); 
         columns.Command(commands => 
             commands.Edit().ButtonType(GridButtonType.Image) 
          ).Width(60); 
        }) 
        .Editable(editing => editing.Mode(GridEditMode.InLine)) 
        .Scrollable(scrolling => scrolling.Height(140)) 
        .Footer(false) 
        .Sortable() 
        .Resizable(resizing => resizing.Columns(true)) 
        .Reorderable(reorder => reorder.Columns(true)) 
       ) 

      </td> 
     </tr> 
    </table> 
</div> 

ответ

0

Я решить его !!

Может быть, это не самый лучший способ, но работает на 100% большую:

Как это работает:

На мой UIHint View Я создал простой Div. Каждый раз, когда этот пользователь вводит в режиме редактирования в моей сетке, я выполняю Javascript с действием ajax post. Это вернет URL. Затем я запустил URL-адрес, чтобы загрузить PartialView с DropDownList, а другой с помощью TextBox.

Надеюсь, это поможет!

Полный код:

Вид: Общий/EditorTemplates/_FamilyParameterValue.cshtml

<div id="divFamilyParameterValue"> </div> 

Контроллер:

public ActionResult FamilyPArameterValueDdl(string id) 
     { 
      var tmpParameter = DetailHvmModel.HvmModel.CurrentArticle.Family.Parameters.Where(e => e.Code == id).FirstOrDefault(); 
      return PartialView("_FamilyPArameterValueDdl",tmpParameter); 
     } 
    public ActionResult FamilyPArameterValueTextBox(string id) 
    { 
     var tmpParameter = DetailHvmModel.HvmModel.CurrentArticle.Family.Parameters.Where(e => e.Code == id).FirstOrDefault(); 
     return PartialView("_FamilyPArameterValueTextBox", tmpParameter); 
    } 

    public ActionResult _EditMaterial_EditParameters(string id) 
    { 

     var tmpParameter = DetailHvmModel.HvmModel.CurrentArticle.Family.Parameters.Where(e => e.Code == id).FirstOrDefault(); 
     string FamilyParameterValueView; 
     // get the parameter that will edit 

     if(tmpParameter.PossibleValues.Any()) 
     { 
       FamilyParameterValueView = Url.Action("FamilyPArameterValueDdl"); 
     } 
     else 
     { 
      FamilyParameterValueView = Url.Action("FamilyPArameterValueTextBox"); 
     } 


     return Json(new { familyParameterValueView = FamilyParameterValueView }); 
    } 

Вид: Основное

<div style="height:270px" > 
    <table> 
     <tr> 
      <td width="100%"> 
       <br /> 

       @(Html.Telerik().Grid<FamilyParameter>() 
         .Name("GridParam") 
         .DataKeys(keys => keys.Add(param => param.Code)) 
         .HtmlAttributes(new { style = "width: 420px;" }) 
         .NoRecordsTemplate("No existen resultados...") 
         .DataBinding(
          dataBinding => dataBinding.Ajax() 
              .Select("_EditMaterial_SelectParameters", Controllers.Valoration,Model) 
              .Update("_EditMaterial_UpdateParameters", Controllers.Valoration,Model) 
        ) 
         .Columns(columns => 
          { 
           columns.Bound(param => param.Code).Width("75px").HtmlAttributes(new { style = "text-align: left;" }).ReadOnly(); 
           columns.Bound(param => param.Description).Width("200px").HtmlAttributes(new { style = "text-align: left;" }).ReadOnly(); 
           columns.Bound(param => param.Value).Width("65px").HtmlAttributes(new { style = "text-align: left;" }); 
           columns.Command(commands => 
               commands.Edit().ButtonType(GridButtonType.Image) 
           ).Width(60); 
          }) 
         .Editable(editing => editing.Mode(GridEditMode.InLine)) 
         .Scrollable(scrolling => scrolling.Height(140)) 
         .Footer(false) 
         .Sortable() 
           .ClientEvents(e => e.OnEdit("OnEditGridParam")) 
         .Resizable(resizing => resizing.Columns(true)) 
         .Reorderable(reorder => reorder.Columns(true)) 
        ) 

      </td> 
     </tr> 
    </table> 
</div> 

<script type="text/javascript"> 

    function OnEditGridParam(e) { 
     var item = { id: e.dataItem.Code }; 
     $.ajax({ 
      url: "/Valoration/_EditMaterial_EditParameters", 
      type: "POST", 
      async: false, 
      data: item, 
      success: function (data, status, xhr) { 

       $.post(data.familyParameterValueView, item, function (partial) { $('#divFamilyParameterValue').html(partial); }); 

      }, 
      error: function (xhr, status, err) { 
       alert(err); 
      } 
     }); 


    } 

</script> 

Вид: _FamilyParameterValueDdl.cshtml

@model Bpt.Domain.FamilyParameter 

@(Html.DropDownListFor(e => e.Value, new SelectList(Model.PossibleValues), new { style="font-size:12px;" })) 

Вид: _FamilyParameterValueTextBox.cshtml

@model Bpt.Domain.FamilyParameter 

@Html.TextBoxFor(e => e.Value) 
0

Я заметил, что вы используете Telerik, я использую Кендо и синтаксис выглядит так же, вот сетку я использую ,

@(Html.Kendo().Grid(Model) 
    .Name("grdDocumentManager") 
    //Column Binding 
    .Columns(columns => 
       { 
        columns.Bound(dm => dm.DocumentNote).Title("Note").Width("20px").ClientTemplate("#if(trim(DocumentNote) != \"\"){#" + 
                "<img src=\"/content/i_discuss.gif\" title=\"View Notes\" onclick=\"javascript:showWindow(#=DocumentId#, '#=CaseId#');\" width=\"16\" height=\"16\" border=\"0\" style=\"cursor:pointer;\">#}" + 
               "else{#" + 
                "<img src=\"/content/i_rate.gif\" title=\"Add Note\" onclick=\"javascript:showWindow(#=DocumentId#, '#=CaseId#');\" width=\"16\" height=\"16\" border=\"0\" style=\"cursor:pointer;\">" + 
               "#}#"); 
        columns.Bound(dm => dm.DocumentId).Hidden(true); 
        columns.Bound(dm => dm.CaseId).Width("50px"); 
        columns.Bound(dm => dm.PresidingJudge).ClientGroupHeaderTemplate("Presiding Judge: #=value#").Width("20px"); 
        columns.Bound(dm => dm.MagistrateJudge).ClientGroupHeaderTemplate("Magistrate Judge: #=value#").Width("20px"); 
        columns.Bound(dm => dm.CaseType).Width("20px"); 
        columns.Bound(dm => dm.StatusValue).Width("20px").ClientTemplate("#=Status#").EditorTemplateName("StatusEditor").Title("Status"); 
        columns.Bound(dm => dm.UserName).Width("20px").EditorTemplateName("UserNameEditor"); 
        columns.Bound(dm => dm.CreationDate).Width("50px").Format("{0:g}"); 
        columns.Bound(dm => dm.PageCount).Width("20px"); 
        columns.Command(command => command.Edit()).Width(200); 
       } 
) 
    .Editable(e => e.Mode(GridEditMode.InLine)) 
    .DataSource(ds => ds.Ajax() 
        .Model(m => { 
            m.Id(dm => dm.DocumentId); 
            m.Field(dm => dm.CaseId).Editable(false); 
            m.Field(dm => dm.CaseType).Editable(false); 
            m.Field(dm => dm.CreationDate).Editable(false); 
            m.Field(dm => dm.DocumentNote).Editable(false); 
            m.Field(dm => dm.MagistrateJudge).Editable(false); 
            m.Field(dm => dm.PresidingJudge).Editable(false); 
            m.Field(dm => dm.PageCount).Editable(false); 

        }) 
        .Update(update => update.Action("DocumentUpdate","Admin")) 


      ) 
) 

, если вы заметили на переплетах колонка он имеет свойство EditorTemplate там вы определяете имя вашего редактора (убедитесь, что в редакторе название управления таким же имя, как свойство привязки) и сетка создаст для нее правильное представление.

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