2013-01-18 87 views
2

所有我第一次搜索我的問題,但無法找到任何幫助我進一步。ASP.NET MVC:傳遞一個複雜的viewmodel到控制器

我想實現一個允許我爲當前用戶設置權限的視圖。

由於數據結構我用下面的遞歸類,其中每個PermissionTree-對象引用的子權限(權限在我的應用程序分層結構):

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; 
       }) 

       ) 
      ) 
    ) 

好的,所以當我點擊按鈕時,我希望我的viewmodel被髮送到用[HttpPost]裝飾的控制器動作。但是,當我調試應用程序時,收到的模型並不包含我的數據(儘管它不是null)。 有誰知道我可以如何實現我的目標,並獲得整個viewmodel?

最好的問候, r3try

+0

你在視圖中有任何輸入字段嗎? – ken2k

+0

不,我只使用帶複選框的樹形視圖 – r3try

+0

試着看看模型綁定中發生了什麼:http:// stackoverflow。com/questions/4651085/best-practices-for-debugging-asp-net-mvc-binding – ngm

回答

2

我覺得這是更好地在這裏使用一個JSON後,則很容易在JavaScript方面準備的對象。

我不知道HTML的外觀如何,或者元素的名稱可以很容易地使用javascript/Jquery構建客戶端json對象,類似名稱和更簡單的層次結構/數據類型,就像在PermissionTree類中一樣。然後使用Ajax後張貼的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構建的對象。

+0

我想我沒有完全理解這個...... 你的意思是當我點擊提交按鈕時,我應該使用javascript手動創建序列化對象,然後使用ajax將數據發佈到我的控制器?我真的不明白爲什麼在mvc中存在強類型視圖時,甚至無法將該視圖模型傳遞迴控制器。是不是修改模型的觀點? .. \ *嘆* \ *沮喪 - 謝謝你的回覆! ;) – r3try

+1

問題在於您擁有的模型集合。要強烈發佈類型視圖並填充模型,您需要在視圖中使用適當的命名約定。我的意思是在HTML中,你的輸入應該有像'Children [0] .Chilren [1] .Permission'這樣的名字。 –

+0

如果您沒有那種最好的方法,那就是填充JSON對象並使用Ajax傳遞它。 –

0

,因爲我不能得到那個工作我是想稍微不同的方法:

例如增加一個節點: - 按添加按鈕 - >執行AJAX調用 - >在NHibernate中添加節點 - >調用視圖中再次與新的數據(包括新節點)

控制器動作由所述AJAX請求稱爲:

[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請求在View:

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調用不回去,只需執行調用的控制器方法?

相關問題