0

HTML カスタム拡張のクラスを追加しました。

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

namespace App.MvcHtmlHelpers    
{
public static class HtmlHelperExtensions
{

    public static MvcHtmlString ComboBox(HtmlHelper html, string name, SelectList items, string selectedValue)
    {
        var sb = new StringBuilder();
        sb.Append(html.DropDownList(name + "_hidden", items, new { @style = "width: 200px;", @onchange = "$('input#" + name + "').val($(this).val());" }));
        sb.Append(html.TextBox(name, selectedValue, new { @style = "margin-left: -199px; width: 179px; height: 1.2em; border: 0;" }));
        return MvcHtmlString.Create(sb.ToString());
    }

    public static MvcHtmlString ComboBoxFor<TModel, TProperty>(HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, SelectList items)
    {
        var me = (MemberExpression)expression.Body;
        var name = me.Member.Name;

        var sb = new StringBuilder();
        sb.Append(html.DropDownList(name + "_hidden", items, new { @style = "width: 200px;", @onchange = "$('input#" + name + "').val($(this).val());" }));
        sb.Append(html.TextBoxFor(expression, new { @style = "margin-left: -199px; width: 179px; height: 1.2em; border: 0;" }));
        return MvcHtmlString.Create(sb.ToString());
    }

サイトの Web 構成にも登録しました。

<namespaces>
<add namespace="System.Web.Helpers" /> 
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />        
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
<add namespace="App.MvcHtmlHelpers"/>
</namespaces>

私の見解では、名前空間をインポートします。

<%@ Import Namespace="RSPWebApp.MvcHtmlHelpers" %>

しかし、ビューで呼び出すと、カスタム拡張が認識されません。誰かが私が見逃したかもしれないことを教えてくれますか? よろしくお願いします!<%:Html.ComboBoxFor(a => a.Street2, streetAddressListItems) %>

4

3 に答える 3

2

thisキーワードが不足している可能性があります:

public static MvcHtmlString ComboBox(this HtmlHelper html, string name, SelectList items, string selectedValue)

また、ディレクトリ内の Web.config を確認してViews、次のようなものを探します。

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <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="RSPWebApp.MvcHtmlHelper" />
      </namespaces>
    </pages>
</system.web.webPages.razor>

プロジェクト Web.config の代わりに、名前空間を Views フォルダー内の Razor エンジン自体に明示的に追加する必要があるようです。

于 2012-11-28T23:02:09.483 に答える
0

皆様、ご協力ありがとうございました。確かに、HTMLHelper クラスに「this」キーワードがありませんでした (最初は resharper で赤くなっていたので、常にそれを信頼するべきではありません!)

そして、それを Views フォルダーの web.config に追加しました (奇妙なことにグレー表示されています)。以前のコメントに答えるために、私はMVCを初めて使用し、Razor + MVCと格闘したくないため、実際にASP.Netビューを使用しています。

それは今完全に動作します、ありがとう!

于 2012-11-29T17:50:41.120 に答える
0

this拡張メソッドにキーワードがありません。これを試して:

public static MvcHtmlString ComboBox(this HtmlHelper html, string name, SelectList items, string selectedValue)
    {
        var sb = new StringBuilder();
        sb.Append(html.DropDownList(name + "_hidden", items, new { @style = "width: 200px;", @onchange = "$('input#" + name + "').val($(this).val());" }));
        sb.Append(html.TextBox(name, selectedValue, new { @style = "margin-left: -199px; width: 179px; height: 1.2em; border: 0;" }));
        return MvcHtmlString.Create(sb.ToString());
    }

また、Import Namespace提供したものは、拡張メソッドと同じ名前空間ではないようです。ただし、それらをに追加すると、web.configとにかくカバーする必要があります。

于 2012-11-28T22:57:21.473 に答える