1

私のプロジェクトでは、サーバーから xml ドキュメントを読み込みます。ajax を使用してこれを 1 回呼び出し、変数 (siteData と呼ばれる) に設定します。

ページ上で積極的に siteData を操作し、ユーザーが必要に応じて変更できるようにします。これらの操作が完了したら、XML ドキュメントをサーバーに保存する必要があります。

サーバー側の MVC プロジェクトで C# を使用しています。このメソッドは、解析するために JavaScript で作成した XML ファイルを受け取る必要があります。

2つのオプションがあると思います:

  1. C# を介して siteData 変数がどのように受信されているかを把握し、それを C# メソッドの String ではなくパラメーターとして設定します。

  2. siteData を文字列に変換し、それを C# メソッドに送信して解析します。

どちらのオプションも機能させる方法がわかりません。操作 XML ファイルを C# メソッドに渡してサーバーに保存したいだけです。

どうすればこれを達成できますか?

(注として、プラグインや代替ライブラリは使用できません。jQuery 1.7.2 と C#.NET を使用しています。)

4

2 に答える 2

1

あなたはウェブクライアントを使うことができます

http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx

ここにサンプル

 Console.Write("\nPlease enter the URI to post data to : ");
            string uriString = Console.ReadLine();
            // Create a new WebClient instance.
            WebClient myWebClient = new WebClient();
            Console.WriteLine("\nPlease enter the data to be posted to the URI {0}:",uriString);
            string postData = Console.ReadLine();
            // Apply ASCII Encoding to obtain the string as a byte array. 
            byte[] postArray = Encoding.ASCII.GetBytes(postData);
            Console.WriteLine("Uploading to {0} ...",  uriString);                          
         myWebClient.Headers.Add("Content-Type","application/x-www-form-urlencoded");

            //UploadData implicitly sets HTTP POST as the request method. 
            byte[] responseArray = myWebClient.UploadData(uriString,postArray);

            // Decode and display the response.
            Console.WriteLine("\nResponse received was :{0}", Encoding.ASCII.GetString(responseArray));
于 2012-08-17T21:59:38.637 に答える
1

カスタム モデル バインダーを作成できます。例を見てみましょう。次のコントローラーがあるとします。

public class HomeController : Controller
{
    // Serve the view initially
    public ActionResult Index()
    {
        return View();
    }

    // This will be called using AJAX and return an XML document to the
    // client that will be manipulated using javascript
    public ActionResult GetXml()
    {
        return Content("<foo><bar id=\"1\">the bar</bar></foo>", "text/xml");
    }

    // This will be called using AJAX and passed the new XML to persist
    [HttpPost]
    public ActionResult Save(XDocument xml)
    {
        // TODO: save the XML or something
        return Json(new { success = true });
    }
}

クライアントでは、次の JavaScript を使用できます。

<script type="text/javascript">

    // send an AJAX request to retrieve the XML initially
    $.ajax({
        url: '@Url.Action("getxml")',
        type: 'GET',
        cache: false,
        success: function (data) {
            // The data variable will contain the initial xml
            // Now let's manipulate it:
            $(data).find('bar').attr('id', '7');

            var xmlString = data.xml ? data.xml : (new XMLSerializer()).serializeToString(data);

            // Let's send the modified XML back to the server using AJAX:
            $.ajax({
                url: '@Url.Action("save")',
                type: 'POST',
                contentType: 'text/xml',
                data: xmlString,
                success: function (result) {
                    // ...
                }
            });
        }
    });
</script>

そして最後の部分は、コントローラーの保存アクションが XDocument を取得できるように、XDocument タイプのカスタム モデル バインダーを作成することです。

public class XDocumentModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        if (!request.ContentType.StartsWith("text/xml", StringComparison.OrdinalIgnoreCase))
        {
            return null;
        }
        return XDocument.Load(request.InputStream);
    }
}

これは Application_Start に登録され、XDocument タイプに関連付けられます。

ModelBinders.Binders.Add(typeof(XDocument), new XDocumentModelBinder());
于 2012-08-18T07:56:54.953 に答える