0

MvcHtmlString (HtmlHelper 拡張機能の結果) から属性を解析して、属性を更新および追加できるようにする必要があります。

たとえば、次の HTML 要素を使用します。

<input type="text" id="Name" name="Name" 
 data-val-required="First name is required.|Please provide a first name.">

data-val-requiredから値を取得し、それを 2 つの属性に分割して、2 番目の値を新しい属性にする必要があります。

<input type="text" id="Name" name="Name" 
 data-val-required="First name is required."
 data-val-required-summary="Please provide a first name.">

HtmlHelper 拡張メソッドを使用してこれを実行しようとしていますが、属性を解析する最善の方法がわかりません。

4

1 に答える 1

-1

目的を達成するための 1 つのアイデアは、グローバル アクション フィルターを使用することです。これにより、アクションの結果が取得され、ブラウザに送り返される前に変更できるようになります。この手法を使用して CSS クラスをページの body タグに追加しましたが、アプリケーションでも機能すると思います。

これが私が使用したコードです(基本に要約されています):

public class GlobalCssClassFilter : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        //build the data you need for the filter here and put it into the filterContext
        //ex: filterContext.HttpContext.Items.Add("key", "value");

        //activate the filter, passing the HtppContext we will need in the filter.
        filterContext.HttpContext.Response.Filter = new GlobalCssStream(filterContext.HttpContext);
    }
}

public class GlobalCssStream : MemoryStream {
    //to store the context for retrieving the area, controller, and action
    private readonly HttpContextBase _context;

    //to store the response for the Write override
    private readonly Stream _response;

    public GlobalCssStream(HttpContextBase context) {
        _context = context;
        _response = context.Response.Filter;
    }

    public override void Write(byte[] buffer, int offset, int count) {
        //get the text of the page being output
        var html = Encoding.UTF8.GetString(buffer);

        //get the data from the context
        //ex var area = _context.Items["key"] == null ? "" : _context.Items["key"].ToString();

        //find your tags and add the new ones here
        //modify the 'html' variable to accomplish this

        //put the modified page back to the response.
        buffer = Encoding.UTF8.GetBytes(html);
        _response.Write(buffer, offset, buffer.Length);
    }
}

注意すべきことの 1 つは、HTML が 8K のチャンクにバッファリングされることです。そのため、そのサイズを超えるページがある場合は、それを処理する方法を決定する必要があるかもしれません。私のアプリケーションでは、それに対処する必要はありませんでした。

また、すべてがこのフィルターを介して送信されるため、行っている変更が JSON の結果などに影響を与えないようにする必要があります。

于 2012-07-14T01:06:53.587 に答える