2

まず第一に、質問を検索しましたが、それ以上進むのに役立つものは何も見つかりませんでした。

現在のユーザーの権限を設定できるビューを実装しようとしています。

データ構造として、各 PermissionTree-Object がサブ権限を参照する次の再帰クラスを使用します (権限はアプリケーションで階層的に構造化されています)。

public class PermissionTree
{
        public Permission Node; //the permission object contains a field of type SqlHierarchyId if that is relevant
        public bool HasPermission;
        public IList<PermissionTree> Children;
   //i cut out the constructors to keep it short ...
}

コントローラーは次のようになります。

//this is called to open the view
 public ActionResult Permissions()
    {
        //pass the root element which contains all permission elements as children (recursion)
        PermissionTree permissionTree = PopulateTree();//the fully populated permission-tree
        return View(permissionTree);
    }

//this is called when i submit the form
    [HttpPost]
    public ActionResult Permissions(PermissionTree model)
    {
        SetPermissions(model);
        ViewData["PermissionsSaved"] = true;

        return View(model);//return RedirectToAction("Index");
    }

次のような強く型付けされたビューを使用しています。

@model PermissionTree
//....
 @using (Html.BeginForm("Permissions", "Permission", null, FormMethod.Post, new { @class = "stdform stdform2" }))
{    
<input name="save" title="save2" class="k-button" type="submit" />

<div class="treeview">
//i am using the telerik kendoUI treeview
    @(Html.Kendo().TreeView()
            .Name("Permissions")
            .Animation(true)
            .ExpandAll(true)
            .Checkboxes(checkboxes => checkboxes
                .CheckChildren(true)
            )
            .BindTo(Model, mapping => mapping
                .For<PermissionTree>(binding => binding
                .Children(c => c.Children)
                .ItemDataBound( (item, c) => {
                    item.Text = c.Node.PermissionName;
                    item.Checked = c.HasPermission;
                })

                )
            )
      )

わかりましたので、ボタンをクリックすると、ビューモデルが で装飾されたコントローラーアクションに送信されるようにし[HttpPost]ます。しかし、アプリケーションをデバッグすると、受信したモデルには実際にはデータが含まれていません (null ではありません)。目標を達成してビューモデル全体を取得する方法を知っている人はいますか?

よろしく、r3try

4

2 に答える 2

2

ここでは JSON 投稿を使用する方が良いと思います。そうすれば、JavaScript 側でオブジェクトを準備するのは簡単です。

あなたのHTMLがどのように見えるか、またはjavascript/Jqueryを簡単に使用して、PermissionTreeクラスのように同様の名前とスリムな階層/データタイプを持つクライアント側のjsonオブジェクトを簡単に作成できる要素の名前がわかりません。そして、Ajax post を使用して JSON として投稿します

 var PermissionTree={Node:{},HasPermission:false,Children:{}}
 $.ajax({  data:PermissionTree
                            type: "POST",
                            url: 'YourController/Permissions',
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            success: function (result) {   
               }
);   

重要なことは、ツリー ビューを調べて JavaScript でオブジェクトを構築するためのより良い方法を見つける必要があるということです。

于 2013-01-18T10:31:54.133 に答える
0

私はそれを機能させることができないので、少し異なるアプローチを試みていました:

ノードを追加する例: - 追加ボタンを押す -> ajax 呼び出しを実行する -> nhibernate にノードを追加する -> 新しいデータ (新しいノードが含まれる) でビューを再度呼び出す

ajax リクエストによって呼び出される controller-action:

[Authorize]
    [HttpPost]
    public ActionResult AddPermission(string parentPermissionName, string permissionName)
    {
        var pd = ServiceContext.PermissionService.permissionDao;
        Permission parentPermission = pd.GetPermissionByName(parentPermissionName);
        if (parentPermission == null) {
            parentPermission = pd.GetRoot();
        }

        if (parentPermission != null && !string.IsNullOrEmpty(permissionName) && !pd.PermissionExists(permissionName))//only add with a name
        {
            pd.AddPermission(parentPermission, permissionName);
        }
        //refresh data
        PermissionTree permissionTree = LoadTreeSQLHierarchy(null, false);//start at root
        return View("Permissions", permissionTree);
    }

ビューでの Ajax リクエスト:

function addNode() {
    //... get the data here
    var addData = { parentPermissionName: selectedNodeName, permissionName: newNodeName };

    $.ajax(
       {
           data: addData,
           type: "POST",
           url: '@Url.Action("AddPermission", "Permission")',
           dataType: "json",
           success: function (result) {
               //$('.centercontent').html(response);//load to main div (?)
               return false;
           },
           error: function (xhr, ajaxOptions, thrownError) {
               alert(xhr.status + ":" + thrownError);
               return false;
           }
       }
    );
    return false;
}

しかし、これを実行すると、json.parse が無効な文字にヒットしたというエラーが表示されます (このエラーは、ajax のエラー関数のアラートで表示されます)。そのメッセージから判断すると、問題はhtmlを返しているが、ajax呼び出しはjsonなどを期待していることだと思います...しかし、新しいデータでビューをリロードする正しい方法は何ですか? どうにかして ajax 呼び出しにまったく戻らず、呼び出されたコントローラー メソッドを実行するように伝えることはできますか?

于 2013-01-22T08:04:34.523 に答える