0

Asp.net MVC 用に、非常に厳密に型指定されたタイプ セーフなプロジェクトをビルドする必要があるためです。しかし、View ページの構文の多くは、タイプ セーフな変数ではないことがわかりました。次の例を見てください。

BeginForm("LogOn", "Account")

それ以外の

Form.BeginForm(x => Account.LogOn)

上記のコードのようなものを作成することは可能ですか? 強く型付けされた非常に美しいソースコードです。

アップデート!

式ツリーでは不可能であることがわかりました。次のコードを見てください。

1 つのアクションのみを含むコントローラー クラス。public class Controller1 { public View Action1() { null を返します。} }

式コードを見てください。

Expression<Action<Controller1>> exp1 = (c => c.Action1());

Expression part = exp1.Body;

if (part.NodeType == System.Linq.Expressions.ExpressionType.Call)
{
    MethodCallExpression callExpression = (MethodCallExpression)part;

    MessageBox.Show(callExpression.Method.DeclaringType.Name + " : " + callExpression.Method.Name);
}

結果は「Controller1:Action1」!

アップデート2!

次のコードは、厳密に型指定された begin フォームの最終的なコードです。

public static MvcForm BeginForm<BaseController>(this HtmlHelper htmlHelper, Expression<Action<BaseController>> routeExp)
{
    Expression part = routeExp.Body;

    if (part.NodeType == System.Linq.Expressions.ExpressionType.Call)
    {
        MethodCallExpression callExpression = (MethodCallExpression)part;
        MethodInfo actionMethod = callExpression.Method;

        return htmlHelper.BeginForm(actionMethod.Name, actionMethod.DeclaringType.Name);
    }

    throw new Exception();
}

したがって、次のパターンを使用して呼び出すことができます。

<% Html.BeginForm<HomeController>(x => x.Index()); %>

ありがとう、

4

2 に答える 2

0

MVC Futures は、このようなものをサポートしています

asp.net/mvcまたはcodeplexからダウンロードして、ソース コードも「マニュアル」として入手できます。

警告: 「先物」であるため、将来のリリースで変更される可能性があります

于 2009-10-05T04:38:49.977 に答える
0

ラムダ式が可能になりましたが、この場合は役に立ちません。あなたの例を見てみましょう: BeginForm メソッドは入力として 2 つの文字列を受け取り、ラムダ式の量がそれを変更することはありません。

これらの文字列を 1 つまたは複数のクラスのプロパティとしてカプセル化することもできますが、その理由でよりタイプ セーフになることはありません。

名前のスペルミスのリスクを減らすために、すべての文字列を中央の場所に移動すると少しは役立つかもしれませんが、それでも文字列のままです。

于 2009-10-05T04:39:52.347 に答える