2014-04-29 180 views
0

我在我的C#/ MVC4應用程序中加載了一個局部視圖,其目的是用購物車的基礎知識更新模型。爲什麼我的viewmodel不能更新?

部分視圖更新,但是當我選擇下一個項目並提交時,viewmodel不包含第一次推送的數據。

我有一個類來存儲數據:

public class Selection 
{ 
    public class AllItems _AllItems { get; set; } 
    public int nCounter { get; set; } 
    public class Resource _Resource { get; set; } 
} 

我主要觀點有此Ajax表單張貼數據:

   @using (Ajax.BeginForm("Index_AddItem", new AjaxOptions { UpdateTargetId = "AddItemList" })) 

然後,這是我在工作類局部視圖:

public class AllItems 
{ 
    public IEnumerable<SelectListItem> NewItemList { get; set; } 
    public int ID { get; set; } 
    public string ItemName { get; set; } 
    public DateTime dtAddUntil { get; set; } 
    [Display(Name = "Add Item")] 
    public List<MyApp.ViewModels.Item> AddItemList = new List<MyApp.ViewModels.Item>(); 
} 

在主視圖和局部視圖上的所有內容都可以正常顯示。

(_AddItems.cshtml) 
@model IEnumerable<MyApp.ViewModels.Item> 

@{ 
ViewBag.Title = "Added Items"; 
} 


<h2>Items to be Added</h2> 

<table> 
<tr> 
    <th>Item Name</th> 
    <th>Added until</th> 
</tr> 
@if (Model != null) 
{ 
    foreach (var item in Model) 
    { 
     <tr> 
      <td>Html.DisplayFor(model=>item.ItemName)</td> 
      <td>Html.DisplayFor(model=>item.EndDate)</td> 
     </tr> 
    } 
} 
</table> 

但是當我添加使用項目:

[HttpPost] 
public ActionResult Index_AddItem(Resource viewModel, string Text, string Value) 
{ 
    Value = Value.Trim(); 

    List<Item> _items = new List<Item>(); 
    string szItemName = GetItem(Convert.ToInt32(Value)); 

    string test = Request.Form.GetValues("cbxPerm")[0].ToString(); 
    Item NewItem = new Item(); 
    NewItem.ItemName = szItemName; 
    _items.Add(NewItem); 
    return PartialView("_AddItems", _items); 
} 

發送給函數的模型是空的。
第一項增加了很多,我在局部視圖中看到它。
但隨後添加刪除以前添加的項目。
當我在AddItem函數中放置一個斷點並查看模型時;沒有什麼。
爲什麼不重新張貼模型?

回答

1

用於ASP.Net的模型是服務器端,如果需要可更新等,你可以利用Knockout.js或其他客戶端MVVM框架

+0

該模型不應該發佈到部分視圖,因此可以在轉發時訪問它? – DaBlue

+0

敲除岩石。謝謝;我不知道那是存在的。 – DaBlue

+0

您可以在客戶端和服務器之間來回發送viewModel,但這會增加不必要的通信開銷。因此,使用Knockout可以完成客戶端上的所有操作,只需將所有數據保持同步,只上傳和下載必要的數據。 – 3dd

1

你不能真正做到客戶端模式喜歡這個。您正在創建一個新的列表,每次:

List<Item> _items = new List<Item>(); 

你需要的地方保存此列表,然後把它拿來當您使用爲addItems功能每次添加項目。

無論是或者你保存項目的客戶端和所有的帖子同時到他們被保存的地方。

+0

所以模型不張貼?我可以在哪裏保存這個?在發表主表格時,我是否會說得對,這些數據也不會出現? – DaBlue

+0

我不確定什麼Resource viewModel甚至在你的函數中做了什麼......它似乎沒有被使用。您是否從您的Ajax.BeginForm發佈了值?通過AddItem函數添加的任何內容都不會在主表單中出現在模型中,模型不會通過表單中的引用進行傳遞,它們僅僅是自動進行模型綁定的post/get值。 – JuhaKangas

0

讓我們瞭解情況,在你的代碼:

  • List<Item> _items = new List<Item>();

    =>聲明Item類型的新名單。

    • string test = Request.Form.GetValues("cbxPerm")[0].ToString();

    =>你得到一個字符串值&店爲當地的支路測試。

    • Item NewItem = new Item();

    =>聲明新的對象Item類型的NewItem

    • string szItemName = GetItem(Convert.ToInt32(Value)); NewItem.ItemName = szItemName; =>分配值轉換從參數value爲int到NewItem.ItemName

    • _items.Add(NewItem); return PartialView("_AddItems", _items);

    =>添加對象NewItem_items

問題

  • List<Item> _items = new List<Item>();聲明每次&要在其添加只有一個值,所以舊值將被刪除新的列表。

  • 你不使用新的變量test &參數viewModel & Text任何地方。

+0

這我明白...我指的是傳回的視圖模型(Resource viewModel)完全是空的......我期待看到我之前發送的列表... – DaBlue

+0

我期待看到之前發送到部分視圖的列表,以便我可以展開並重新發送回部分視圖。 – DaBlue

相關問題