为什么我的viewmodel没有更新?

时间:2014-04-29 11:47:38

标签: c# asp.net-mvc razor asp.net-ajax

我正在我的C#/ MVC4应用程序中加载部分视图,其意图是使用购物车的基础知识更新模型。

部分视图更新,但是当我选择下一个项目并提交时,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函数中放置一个断点并查看模型时;里面什么也没有 为什么模型不能重新发布?

3 个答案:

答案 0 :(得分:1)

ASP.Net的模型是服务器端,如果需要可以更新的客户端模型等,可以使用Knockout.js或其他客户端MVVM框架

答案 1 :(得分:1)

你真的不能这样做。您每次都在创建一个新列表:

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

您需要将此列表保存在某处,然后在每次使用additems函数时获取并添加项目。

或者您将项目客户端和所有内容同时保存到保存它们的位置。

答案 2 :(得分:0)

让我们了解您的代码中发生了什么:

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

    =&GT;声明类型为Item的新列表。

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

    =&gt;您获得单字符串值&amp;存入本地字符串测试。

    • Item NewItem = new Item();

    =&GT;声明类型为NewItem的新对象Item

    • string szItemName = GetItem(Convert.ToInt32(Value)); NewItem.ItemName = szItemName; =&GT;将值从参数value转换为int到NewItem.ItemName

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

    =&gt;将对象NewItem添加到_items

<强>问题

  • List<Item> _items = new List<Item>();每次都声明新列表&amp;您只在其中添加一个值,删除旧值

  • 您不使用新变量test&amp;参数 viewModel &amp; Text任何地方。