0

序章:

値と呼ばれるフィールドを持つグリッドがあり、そのフィールドはユーザーが編集できます。

私のモデルには、PossibleValuesを含むIEnumerableリストがあります。ユーザーが編集しようとしたときにPossibleValues = Empty(グリッドのValueフィールド)の場合、デフォルトでテキストボックスを表示する必要がありますが、PossibleValuesにValuesがある場合は、すべての可能な値を含むDropDownList。

問題:

編集モードでUIHintを使用すると、dropDownListを表示できますが、現在のモデルをOverriedViewに送信する方法がわかりません...

コード:

モデル:

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

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

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

    }
}

表示:Shared / 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>
4

2 に答える 2

0

あなたが Telerik を使用していることに気付きました。私は Kendo を使用していますが、構文は同じように見えます。これが私が使用するグリッドです。

@(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 というプロパティがあることに気付いた場合は、エディターの名前を定義します (エディターで、コントロールの名前がバインドされているプロパティと同じ名前であることを確認してください)。グリッドは適切なビューを生成します。それのための。

于 2013-01-23T18:57:16.070 に答える
0

解決しました!!

最善の方法ではないかもしれませんが、100% うまく機能します:

使い方:

UIHint ビューで、単純な Div を作成しました。そのユーザーがグリッドのエディション モードに入るたびに、URL を返す ajax ポスト アクションで Javascript を実行します。次に、PartialView を DropDownList で、もう 1 つを TextBox でロードするために、URL を実行します。

それが役に立てば幸い!

完全なコード:

表示: Shared/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)
于 2013-01-04T15:25:07.300 に答える