4

ASP.NET MVC と jQuery を使用して、AJAX 呼び出しでデータを保存しています。現在、jQuery ajax() 関数を使用していくつかの JSON データを渡しています。

$.ajax({
    dataType: 'json',
    type: 'POST',
    url: '@Url.Action("UpdateName", "Edit")',
    data: {
        id: 16,
        name: 'Johnny C. Bad'
    }
});

このコントローラー メソッドとヘルパー クラスを使用します。

public void UpdateName(Poco poco)
{
    var person = PersonController.GetPerson(poco.Id);   
    person.Name = poco.Name;
    PersonController.UpdatePerson(person);
}

public class Poco
{
    public int Id { get; set; }
    public string Name { get; set; }
}

JSON データを受け入れる別の方法は、次のように単純に複数の引数を使用することです。

public void UpdateName(int id, string name)
{
    var person = PersonController.GetPerson(id);    
    person.Name = name;
    PersonController.UpdatePerson(person);
}

このアプローチは引数の数が少ない場合は問題ありませんが、私の実際のコードには通常、約 5 ~ 10 個の引数があります。これらすべての引数を宣言して使用する代わりにオブジェクトを使用すると、非常に便利です。

JSONデータを単一のオブジェクトとして受け入れ、このアプローチを使用したいコントローラーメソッドごとにクラスを宣言する必要がない別の方法があるかどうか疑問に思っています。たとえば、次のようなものです。

public void UpdateName(dynamic someData)
{
    var person = PersonController.GetPerson(someData.Id);   
    person.Name = someData.Name;
    PersonController.UpdatePerson(person);
}
4

4 に答える 4

3

FormCollectionを受け入れることができます。次のようになります。

public void UpdateName(FormCollection collection)
{
    var person = PersonController.GetPerson(int.Parse(collection["id"]));
    person.Name = collection["name"];
    person.Age = collection["age"];

    PersonController.UpdatePerson(person);
}
于 2013-02-13T16:21:05.017 に答える
1

考えられる解決策

次のような特定のモデル バインダーを作成します。



    public class DynamicModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (controllerContext.HttpContext.Request.Form.AllKeys.Any(x => x == "dynamic"))
            {
                dynamic model = new ExpandoObject();
                IDictionary underlyingmodel = model;

                foreach (var key in controllerContext.HttpContext.Request.Form.AllKeys)
                    underlyingmodel.Add(key, (bindingContext.ValueProvider.GetValue(key).RawValue as string[]).First());

                return model;
            }

            return base.BindModel(controllerContext, bindingContext);
        }
    }

このバインダーは、「dynamic」という名前の特定の入力をチェックしてから、動的オブジェクトを作成します



    public ActionResult Index()
    {
       return View();
    }

    [HttpPost]
    public ActionResult Index(dynamic input)
    {
       ViewBag.Result = input.phrase;
       return View();
    }

于 2013-02-13T17:09:03.590 に答える
1

なぜそれを達成したいのかよくわかりませんが、動的を使用して達成できます(私はこれを試しませんでした):

public void UpdateName(string parameters)
{
    var dynamicObject = Json.Decode(parameters);
}

Json.Decode は System.Web.Healpers 名前空間にあります

そして、次のように javascript でそれらを渡すことができます。

var dataObject = JSON.stringify({ id: '1', name: 'John' });
$.ajax({
    dataType: 'json',
    type: 'POST',
    url: '@Url.Action("UpdateName", "Edit")',
    data: dataObject 
});
于 2013-02-13T16:26:23.627 に答える