1

うまく機能するjqueryベースの特注のルックアップコントロールがありますが、それをよりきちんとしたソリューションにカプセル化したいと考えています。以下は、Razor ビューに含まれるコードです。舞台裏には、実行時に大部分の作業を行う「InitLookup」と呼ばれる特注の jquery 関数もあります。

   <script type="text/javascript">
       $(document).ready(function () {
           InitLookup('#txtDelegatedToLookup', '#Delegated_To_ID', '@Url.Action("ContactLookup", "marMIS")');
       });
   </script>
   @Html.HiddenFor(m => m.Delegated_To_ID)
   <input id="txtDelegatedToLookup" type="text" />

理想的には、これを、おそらく以下のように、javascript InitLookup() が動的に作成され、内部にカプセル化される、よりきちんとした再利用可能なソリューションに絞り込みたいと思います...

@Html.DynamicLookupFor(m => m.Delegated_To_ID, "ContactLookup", "marMIS")

...ここで、「marMIS」はコントローラーで、「ContactLookup」はコントローラー メソッドです。これらは、ルックアップ中にデータを取得するために使用するアドレスです。

/Views/Shared/EditorTemplatesフォルダーにDynamicLookup というエディター テンプレートを作成しようとしましたが、 @Html.DynamicLookup(...

これに乗る人はいますか?乾杯!

------------ 以下の App_Code の提案! 元の質問に追記!-------------------------

OK、コードを CustomHelpers.cshtml という新しい App_Code フォルダー ファイルにコピーしました。ここにラムダ式を渡して使用するにはどうすればよいですか?

@using System.Security.Policy
@using System.Web.Mvc.Html

@helper DynamicLookup(LAMBDAEXPR, CtrlId, Controller, Method) {
    @Html.HiddenFor(LAMBDAEXPR)
    <input id="txtDelegatedToLookup" type="text" />
    @Html.ValidationMessageFor(LAMBDAEXPR)  

    <script type="text/javascript">
        $(document).ready(function () {
            InitLookup(txtCtrlId, idCtrlId, '@Url.Action(Controller, Method)');
        });
    </script>            
}
4

2 に答える 2

0

OK、これが私が最終的にやったことです。それは確かに非常にうまく機能します!将来的には少し磨く必要がありますが、これを少し拡張するためにドアを開いたままにしておきます。たとえば、コントロールは検証しますが、残りの検証のようにそれ自体に色を付けるのではなく、テキストの検証メッセージを表示するだけです。

機能はそのように呼ばれます...

@Html.CustomLookupFor(m => m.Task_History.Delegated_To_ID, "txtDelegatedToLookup", @Url.Action("ContactLookup", "marMIS"), new { width = "250px" })

...そしてかみそりの表示ページの上部にusingステートメントが必要です...

@using Custom.MVC.Helpers;

ところで、2つのこと... jquery1.7.2+とjqueryui1.8.16+は、私がこれを開発しているときに使用されたものです!また、以下の最初のコードセクションの機能には、コード内のjavascript機能の縮小バージョンと、適切にフォーマットされた元のjavascriptコードを含むコメント付きセクションの両方が含まれています。

その場合、バックグラウンドには2つのコードがあります。ここでの最初のコードは、最初の質問に関して開発しようとしていた再利用可能なコードです。その下の2つ目は、サーバー上のコントローラーメソッドです。

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;

namespace Custom.MVC.Helpers
{
    public static class CustomHtmlHelperExtensions
    {
        public static MvcHtmlString CustomLookupFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> exp, string id, string url, object options)
        {   
            var hidCtrlId = id + "_id"; 

            //Options
            var opt = new RouteValueDictionary(options);
            var textBoxWidth = (opt["width"] != null) ? opt["width"].ToString() : "";
            var textBoxVisibility = (opt["visibility"] != null) ? opt["visibility"].ToString() : ""; 

            //Construct the script fired when the document is fully loaded
            var sbScript = new StringBuilder();
            sbScript.Append("<script type='text/javascript'>");
            sbScript.Append("  function InitDynamicLookupFor(e,f){var g='#'+e;var h='#'+e+'_id';$(g).click(function(){$(g).val('');$(h).val('');$(h).trigger('change')});$(g).autocomplete({minLength:3,delay:100,autoFocus:true,autofill:true,mustMatch:true,matchContains:true,width:220,source:function(c,d){$.ajax({url:f,type:'POST',dataType:'json',data:{searchId:0,searchTerm:c.term,searchLimit:10},success:function(b){d($.map(b,function(a){return{id:a.id,value:a.value}}))}})},create:function(b,c){if($(h).val()!=''){$.ajax({url:f,type:'POST',dataType:'json',data:{searchId:$(h).val(),searchTerm:'',searchLimit:1},success:function(a){$(g).val(a[0].value);$(g).removeClass('DynamicLookupForNotSelected');$(g).addClass('DynamicLookupForSelected')}})}},select:function(a,b){$(h).val(b.item.id);$(g).val(b.item.value);$(g).removeClass('DynamicLookupForNotSelected');$(g).addClass('DynamicLookupForSelected');$(h).trigger('change');return false},open:function(a,b){$(h).val(null);$(g).removeClass('DynamicLookupForSelected');$(g).addClass('DynamicLookupForNotSelected')}});if($(h).val()==''){$(g).val('Type here to search!');$(g).removeClass('DynamicLookupForSelected');$(g).addClass('DynamicLookupForNotSelected')}}");
            sbScript.Append("  ");
            sbScript.Append("  $(document).ready(function () {");
            sbScript.Append("    InitDynamicLookupFor('" + id + "', '" + url + "');");
            sbScript.Append("  });");
            sbScript.Append("</script>");

            //Construct the HTML controls for the DynamicLookup and its validation
            var sbCtrls = new StringBuilder();
            sbCtrls.Append(html.HiddenFor(exp, new { id=hidCtrlId }));
            sbCtrls.Append("<input id='" + id + "' type='text' style='width:" + textBoxWidth + "; visibility:" + textBoxVisibility + ";' />");
            sbCtrls.Append(html.ValidationMessageFor(exp));

            //Return the lot back to the interface
            var retString = sbScript.ToString() + sbCtrls.ToString();
            return new MvcHtmlString(retString);
        }

    }
}

            //*** This is the original javascript code before it is minified for use above!  DON'T DELETE! ***
            //
            //    function InitDynamicLookupFor(textBox, url) {
            //    var $textBox = '#' + textBox;
            //    var $hiddenId = '#' + textBox + '_id';

            //    $($textBox).click(function () {
            //        $($textBox).val('');
            //        $($hiddenId).val('');
            //        $($hiddenId).trigger('change');
            //    });

            //    $($textBox).autocomplete({
            //        minLength: 3,
            //        delay: 100,
            //        autoFocus: true,
            //        autofill: true,
            //        mustMatch: true,
            //        matchContains: true,
            //        width: 220,
            //        source: function (request, response) {
            //            $.ajax({
            //                url: url, type: 'POST', dataType: 'json',
            //                data: { searchId: 0, searchTerm: request.term, searchLimit: 10 },
            //                success: function (data) {
            //                    response($.map(data, function (item) {
            //                        return {
            //                            id: item.id,
            //                            value: item.value
            //                        };
            //                    }));
            //                }
            //            });
            //        },
            //        create: function (event, ui) {
            //            if ($($hiddenId).val() != '') {
            //                $.ajax({
            //                    url: url, type: 'POST', dataType: 'json',
            //                    data: { searchId: $($hiddenId).val(), searchTerm: '', searchLimit: 1 },
            //                    success: function (data) {
            //                        $($textBox).val(data[0].value);
            //                        $($textBox).removeClass('DynamicLookupForNotSelected');
            //                        $($textBox).addClass('DynamicLookupForSelected');
            //                    }
            //                });
            //            }
            //        },
            //        select: function (event, ui) {
            //            $($hiddenId).val(ui.item.id);
            //            $($textBox).val(ui.item.value);
            //            $($textBox).removeClass('DynamicLookupForNotSelected');
            //            $($textBox).addClass('DynamicLookupForSelected');
            //            $($hiddenId).trigger('change');
            //            return false;
            //        },
            //        open: function (event, ui) {
            //            $($hiddenId).val(null);
            //            $($textBox).removeClass('DynamicLookupForSelected');
            //            $($textBox).addClass('DynamicLookupForNotSelected');
            //        }
            //    });

            //    //If no value selected by now, indicate to the user how to use the control
            //    if ($($hiddenId).val() == '') {
            //        $($textBox).val('Type here to search!');
            //        $($textBox).removeClass('DynamicLookupForSelected');
            //        $($textBox).addClass('DynamicLookupForNotSelected');
            //    }
            //}

サーバー上のコントローラーメソッド...

public JsonResult ContactLookup(int searchId, string searchTerm, int searchLimit)
    {
        //Prepare search filter from criteria entered
        var p = PredicateBuilder.True<vw_Contact_Verbose>();
        if (searchId != 0) p = p.And(x => x.Contact_ID == searchId); 
        if (searchTerm != "") p = p.And(x => x.Fullname.Contains(searchTerm));

        //Grab data
        var results =
            (from x in _mDb.ent.vw_Contact_Verbose.AsExpandable().Where(p).OrderBy("Fullname Desc").Take(searchLimit)
             select new { id = x.Contact_ID, value = x.Fullname + " (" + x.Company + ")" }).ToArray();

        return Json(results, JsonRequestBehavior.AllowGet);
    }  

この再利用可能なコードが、私と同じように他の人にも役立つことを願っています。それは確かに私のコードをかみそりのビューでより冗長にしました。

于 2012-05-24T13:05:38.927 に答える
0

HtmlHelperJavaScript 部分をカプセル化する場合は、目的のコンテンツを生成する を作成できます。

例としては、次のようになります。

public static MvcHtmlString DynamicLookupFor(this HtmlHelper htmlHelper, string txtCtrlId, string idCtrlId, string controllerName, string actionName)
{
    // create script tag
    var script = new TagBuilder("script");

    // generate script content
    var result = new StringBuilder();
    result.AppendLine("$(document).ready(function () {");
    result.Append("InitLookup(");

    result.Append("'" + txtCtrlId + "',");
    result.Append("'" + idCtrlId + "',");

    // generate action link
    var url = new UrlHelper(HttpContext.Current.Request.RequestContext);
    result.Append("'" + url.Action(actionName, controllerName));

    result.AppendLine("'});");

    script.InnerHtml = result.ToString();
    return MvcHtmlString.Create(script.ToString());
}

ビュー内で、次のようにヘルパーを呼び出すことができます。

@Html.DynamicLookupFor("#txtDelegatedToLookup", "#Delegated_To_ID", "ContactLookup", "marMIS")

Views フォルダー web.config 内にヘルパーを登録することを忘れないでください。

  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="Names Space Of Helper"/>   
  </namespaces>
于 2012-05-22T15:20:30.490 に答える