1

ビューからコントローラーにラムダ式を渡すことが可能かどうか疑問に思います。たとえば、モデルがあります。

public class ExpressionModel<T>
{
    public Expression<Func<T, string>> Expression { get; set; }
}

モデルをビューに渡すコントローラーは次のようになります。

public ViewResult Index()
{
    var expressionModel =  new ExpressionModel<SomeClass>();
    expressionModel.Expression = r => r.SomeStringProperty;

    return View(expressionModel);
}

ビューにモデルが追加されました。

@model ExpressionModel

今Ajaxを使用して、モデルをコントローラーに戻したい

var model = @Html.Raw(Json.Encode(Model));

$.ajax({ url: "@someControllerUrl",  
    type: 'POST',
    data: JSON.stringify(model),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data.success);
    },
    error: function () {
        alert("error");
    }
 });

ビューから式モデルを取得するコントローラー メソッドは次のようになります。

[HttpPost]
public ViewResult Index(ExpressionModel expressionModel)
{
    return View();
}

これはajaxを使用しても可能ですか?または、int、string、bool (またはリスト内または別のクラス内のそれらの任意の組み合わせ) などの標準型のみをポストバックできますか? それが不可能な場合は、何らかの方法で文字列をラムダ式にキャストできますか?

4

1 に答える 1

2

この質問はあなたの質問に似ているようです: JSON結果で関数を定義することは有効ですか?

つまり、いいえ、標準タイプのみをポストバックできます。

長い間:AJAXは、Javascriptを介して非同期的にHTTPデータをサーバーに返しているだけです。そのデータは好きなものにすることができます。次に、サーバーはそのデータの解析方法を決定する必要があります。ユーザー入力(クライアントからの入力はすべてユーザー入力と見なす必要があります)をラムダ式にキャストすることはお勧めできません。これにより、ユーザーはサーバー上で任意のコードを実行できるようになります。

代わりに、有効なラムダ式のサーバー側リストを作成してから、使用するラムダに対応するインデックスを返す必要があります。これにより、サーバーで実行されるコードを完全に制御できます。または、それを除いて、文字列からラムダを構築するいくつかの単純な入力解析を使用します。ただし、そのようにセキュリティホールを作成するのは非常に簡単なので、注意が必要です。

于 2013-02-01T22:47:16.693 に答える