2

場所のリストを含む Telerik MVC ComboBox があります。クライアントは、エンド ユーザーが新しい場所をリストに直接入力できるようにしたいと考えています。

フォームを送信すると、新しい値が受け入れられ、場所テーブルに挿入されます。もちろん、追加されるレコードの LocationID が、新しく挿入された場所の ID に更新されます。

コードスニペットについては以下をお読みください

ComboBox を使用すると、リストにない値を入力できることを読み、デモ (ここ)を使用しました

場所を保存するコード、locationID を編集することは問題ではありません。ここでの問題は、コンボボックスに文字列/文字列ではなく、整数/文字列値のペアのリストが含まれていることです。したがって、私のコードにある問題は、新しい場所の名前を送信しようとすると、それを検証しようとし、番号ではないと言うことです。

LocationID フィールドについてのみ、この検証を試みて抑制する方法が必要ですが、それでも null 値から保護します。

編集を開始

編集:私はこの投稿を見つけましたが、OPが言うように、javascriptハックはあまり拡張できないので、本当に避けたいです。

編集:

私はjavascriptハックを使用することになりました。これが機能することがわかったすべてです。これをメソッドまたは属性にカプセル化し、回答として投稿する予定です。

このハックでは、Telerik(). ScriptRegistrar ().OnDocumentReady() を使用してドキュメント準備完了イベント内にコード ブロックを配置すると、Firefox または Chrome で機能しないことがわかりました。メタデータが最初に適切にプッシュされたとしても、このイベント。

これを回避するには、フォーム終了タグ (クライアント側の検証配列がレンダリングされる場所) のすぐ下にある独自のスクリプト ブロックにコードを手動で配置する必要がありました。

編集を終了

さらに、現在、次のようにモデルに直接バインドしています。

        public JsonResult Create(MyEntity Model)

モデル バインディングを実行するときに、それがどのように機能するかはわかりません。エラーが返されるだけで、アクション メソッドのコードに到達することさえできないと思います。

ここでのアイデアは、メソッド シグネチャで FormCollection を使用し、整数以外の LocationID を検出し、更新を挿入してから、UpdateModel() を実行することでしょうか? もちろん、より良い提案を歓迎します。

ありがとう!

コード スニペット

モデル:

class IntegerValueList
{
    public Int16 ID { get; set; }
    public string Name { get; set; }
}

        var lists = new Dictionary<string, IEnumerable<object>>();

        lists["Locations"] = (from record in db.Locations
                              orderby record.Name
                              select new IntegerValueList
                              {
                                  ID = record.LocationID,
                                  Name = record.Name
                              }).ToList();

コントローラ:

        LocationList = new SelectList(lists["Locations"], "ID", "Name", LocationID);

意見:

                <td>
                    <div class="editor-field">
                        <%: Html.Telerik().ComboBoxFor(model => model.LocationID)
                                .BindTo(Model.LocationList)
                                .Filterable(c => c.FilterMode(AutoCompleteFilterMode.Contains)) 
                        %>

                        <%: Html.ValidationMessageFor(model => model.LocationID, "*") %>
                    </div>
                </td>
4

1 に答える 1

0

過去にこれを行う必要があったときは、フィールドに「場所を入力してください」などのラベルが付いたテキストボックスを使用し、その下に「または選択...」などのラベルが付いたドロップダウンを使用してから、ドロップダウンの onChange イベントを使用して、テキスト ボックスに入力します。現在、ドロップダウンを検証していません。

テキストボックスの横に「選択」リンクを配置して、リンクがクリックされるまでドロップダウンを非表示にすることもできます。欠点は、サンディエゴ、サンディエゴ、サンディエゴのすべてが場所リストに入力される可能性があることです...しかし、顧客の要件により、それを明示的に防止することはできません.

于 2012-04-26T17:33:01.167 に答える