0

私は自分の拡張機能を次のように作成しました:

public static MvcHtmlString hSearch(this HtmlHelper helper, string labelName, string labelCaption, string textName, string textValue, string tableName, string buttonId, 
        string actionName, string controllerName, object routeValues, object htmlAttributes)
    {            
        var textbuilder = new TagBuilder("input");
        textbuilder.MergeAttribute("id", textName);
        textbuilder.MergeAttribute("name", textName);
        textbuilder.MergeAttribute("value", textValue);
        textbuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));


        ModelMetadata metadata = ModelMetadata.FromStringExpression(labelName, helper.ViewData);
        String innerText = labelCaption ?? (metadata.DisplayName ?? (metadata.PropertyName ?? labelName.Split('.').Last())); 
        if (String.IsNullOrEmpty(innerText)) 
        { 
            return MvcHtmlString.Empty; 
        }
        TagBuilder labelbuilder = new TagBuilder("label");
        labelbuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(labelName)));
        labelbuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        labelbuilder.SetInnerText(innerText);            

        //return new MvcHtmlString(textbuilder.ToString());
        var buttonBuilder = new TagBuilder("button");
        buttonBuilder.MergeAttribute("id", buttonId);
        buttonBuilder.SetInnerText(buttonId);

        var formBuilder = new TagBuilder("form");
        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

        formBuilder.Attributes.Add("action", urlHelper.Action(actionName, controllerName, routeValues));

        formBuilder.Attributes.Add("method", "Post");

        formBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        formBuilder.InnerHtml = labelbuilder.ToString() + textbuilder.ToString() + buttonBuilder.ToString();
        return new MvcHtmlString(formBuilder.ToString());
    }

私はビューで拡張機能を次のように使用しました:

 @Html.hSearch("lblSrch", "Company", "companyName", (string)TempData["cName"], "CHComp", "Search", "Fetch", "Home", null, null)

次に、ボタンをクリックしたときにtableNameをコントローラーに渡します。コントローラーは次のようになります。

    public ActionResult Fetch(string search, string tablename)
    {
        var c = cbo.fetchData(search, tablename);
        return PartialView(c.ToList());
    }

返信を待っています..ありがとう..

4

1 に答える 1

1

ヘルパーのコードは提供されていませんが、推測では、ラベル、テキストフィールド(textName)、およびボタンが書き込まれます。この場合、companyName=someValueHTTP経由でコントローラーにポスト/取得します。

FormCollectionフィールドがビューから動的に送信される場合は、通常、コントローラーにを追加する必要があります。または、テキスト検索入力の名前を静的に保つのはなぜですか。たとえばname="search"、同じ名前のコントローラーのパラメーターにバインドされます。

編集 非表示フィールドでtableNameをコントローラーに戻すことができます(<input type='hidden' name='tableName' value='{tableNameGoesHere}'

ただし、上記のように、検索文字列の名前は異なります。モデルバインダーはそれをとして認識しませんstring search

于 2012-08-14T04:40:21.177 に答える