2

本当に簡単な質問。

Nullable Bool を表示する MVC ビューがあります。

Html.CheckBoxFor(model=>model.NullableBoolHere, Model.NullableBoolHere, 

そして、このタイプを受け入れてから変換する新しいhtmlヘルパーを作成したい

Null || False => False
True => True

だから私は次のものを持っています

public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = new RouteValueDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");

        Expression<Func<TModel, bool>> boolExpression = CONVERT_TO_BOOL_HERE(expression);


        return htmlHelper.CheckBoxFor(expression, values);
    }

助けていただければ幸いです。再帰を使用して式をコピーする必要があることは理解していますが、式自体をナビゲートする方法がわかりません。bool を見つけて、bool に変換します。

4

4 に答える 4

1

それで、結局、私がそれをするために見つけることができた唯一の方法は、ブール値を解決することでしたか?自分でブール値に変換し、正しい名前などを渡して「通常の」チェックボックスを返します。

しかし、これはおやつとして機能するので、すべて良いです。正しいParameterNameを取得するためのより良い方法を知っている場合は、聞いていただければ幸いです。

public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = new RouteValueDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");

        //Compile the expression to get the value from it.
        var compiled = expression.Compile().Invoke(htmlHelper.ViewData.Model);
        bool checkValue = compiled.HasValue ? compiled.Value : false; //evaluate the compiled expression

        //Get the name of the id we should use
        //var parameterName = ((MemberExpression)expression.Body).Member.Name; // only gives the last part
        string parameterName = expression.Body.ToString().Replace("model.", "");//.Replace(".", HtmlHelper.IdAttributeDotReplacement);

        //Return our 'hand made' checkbox
        return htmlHelper.CheckBox(parameterName, checkValue, values);
    }
于 2013-02-12T10:43:23.773 に答える
1

次のコードを使用できます。

var body = Expression.Coalesce(expression.Body, Expression.Constant(false));
var boolExpression = (Expression<Func<TModel, bool>>)
    Expression.Lambda(body, expression.Parameters.First());

他の回答の利点は、最初の式をコンパイルせず、単にラップすることです。結果の式は、次のコードで作成されたものと似ています。

m => m.NullableBoolHere ?? false

ライブで確認してください

于 2013-01-16T11:05:56.903 に答える
0

式を別の型に変換するだけでは十分ではないと思います.MVCは理由で式を使用するため、指定された式を調べて魔法を適用する必要があると思います.

次のように、変換を行う新しい式を作成できます。

 Expression<Func<TModel, bool>> boolExpression = 
        T => expression.Compile()(T).GetValueOrDefault(false);

しかし、私が言ったように、MVC はおそらく式内のモデル メンバーなどを調べたいので、それだけでは十分ではないと思います。

于 2013-01-16T11:01:10.353 に答える
0

これはどう:

 Expression<Func<TModel, bool>> boolExpression = model =>
        {
             bool? result = expression.Compile()(model);

             return result.HasValue ? result.Value : false;
        };

そうすれば、元の式をラップして、bool から結果を変換できますか? ブールする。

それはあなたの問題を解決しますか?

于 2013-01-16T11:04:28.473 に答える