代码之家  ›  专栏  ›  技术社区  ›  sohaib javed

在Orchard CMS中创建自定义字段以从单独的模块呈现下拉列表

  •  1
  • sohaib javed  · 技术社区  · 8 年前

    我正在使用OrchardCMS创建网站,这里我想有一个自定义表单的下拉列表。 我创建了一个模块,对其进行ajax调用,并返回填充了db获取值的下拉列表。 我只需要在自定义表单中使用这个下拉列表。我正在想如何实现它? 我已尝试使用此链接创建自定义字段 http://docs.orchardproject.net/Documentation/Creating-a-custom-field-type 但我仍然找不到自己。应该有办法做到这一点。 请指导我怎么做。我感谢你的回应。 谢谢 索哈伊布

    1 回复  |  直到 8 年前
        1
  •  1
  •   devqon    8 年前

    您可以简单地为此创建一个字段。

    MyModule/Fields/MyCustomField.cs:

    public class MyCustomField : ContentField {
        public string SelectedValue {
            get { return Storage.Get<string>(); }
            set { Storage.Set(value); }
        }
    }
    

    MyModule/Drivers/MyCustomFieldDriver.cs:

    public class MyCustomFieldDriver : ContentFieldDriver<MyCustomField> {
    
        // EditorTemplates/Fields/MyCustom.cshtml
        private const string TemplateName = "Fields/MyCustom";
    
        private static string GetPrefix(ContentField field, ContentPart part) {
            // handles spaces in field names
            return (part.PartDefinition.Name + "." + field.Name)
                   .Replace(" ", "_");
        }
    
        protected override DriverResult Display(ContentPart part, MyCustomField field, string displayType, dynamic shapeHelper) {
            return ContentShape("Fields_MyCustom",
                field.Name,
                f => f.Name(field.Name)
                    .SelectedValue(field.SelectedValue));
        }
    
        protected override DriverResult Editor(ContentPart part, MyCustomField field, dynamic shapeHelper) {
            return ContentShape("Fields_MyCustom_Edit", () => shapeHelper.EditorTemplate(
                TemplateName: TemplateName,
                Model: field,
                Prefix: GetPrefix(field, part)));
        }
    
        protected override DriverResult Editor(ContentPart part, MyCustomField field, IUpdateModel updater, dynamic shapeHelper) {
            updater.TryUpdateModel(field, GetPrefix(field, part), null, null);
            return Editor(part, field, shapeHelper);
        }
    }
    

    MyModule/Views/Fields/MyCustom.cshtml:

    @{ 
        var selectedValue = Model.SelectedValue;
    }
    
    <h1>@selectedValue</h1>
    

    MyModule/Views/EditorTemplates/Fields/MyCustom.cshtml:

    @model MyModule.Fields.MyCustomField
    
    <select id="@Html.IdFor(m => m.SelectedValue)" name="@Html.NameFor(m => m.SelectedValue)"></select>
    
    @using (Script.Foot()) {
        Script.Require("jQuery");
    
        <script>
    
            $(function () {
                // your own url ofcourse
                var url = 'http://jsonplaceholder.typicode.com/users',
                    dd = $("#@Html.IdFor(m => m.SelectedValue)");
    
                $.getJSON(url, function (data) {
                    $.each(data, function () {
                        dd.append("<option value='" + this.name + "'>" + this.name + "</option>");
                    });
                });
            });
        </script>
    }
    

    我的模块/位置信息:

    <Placement>
      <Place Fields_MyCustom_Edit="Content:3" />
      <Place Fields_MyCustom="Content:3" />
    </Placement>
    

    这应该是全部:)