为什么模型中的数据不会持续存在?

时间:2014-06-03 15:05:42

标签: c# model-view-controller

我有一个模型,MyViewModel,有一些成员(不包括所有成员)。

namespace ANameSpace
{
    public class MyViewModel
    {
       public int ID { get; set }
       public EditTableObject EditTable { get; set }
       public List<EditTableObject> EditTables { get; set }
       // some other members
    }

    public class EditTableObject
    {
       public int ID { get; set }
       // some other members
    }
}

在控制器中有两个ActionResult Index()方法

在第一个,索引(int?id)中,我为model.ID分配一个值,并将一些EditTableObjects添加到EditTables列表中。

然后,在第二个索引(ViewModel tmpModel)中,我试图在第一个索引方法中使用我赋予值的成员。但是,ID成员不包含我指定的值;它是空的。但奇怪的是,EditTables列表确实包含我分配给它的值。

以下是控制器的一些代码:

namespace AnotherNamespace
{
   public class MyController
   {
      public ActionResult Index(int? id)
      {
         if (id != null)
         {
            model.ID = (int)id;
         }
         else
         {
            model.ID = 1000;
         }


         model.EditTable = new EditTableObject();

         model.EditTable.ID = model.ID;

         model.EditTables.Add(model.EditTable);

         return View(model);
      }

      public ActionResult(MyViewModel tmpModel)
      {
         return RedirectToAction("Index", new { id = tmpModel.ID });
      }
   } 
}

如果我在第二个Index方法上设置了一个断点,我发现所有的EditTables数据都存在,但不是model.ID数据。

为什么EditTables数据是持久的而不是model.ID数据?

感谢您的任何建议。

3 个答案:

答案 0 :(得分:0)

虽然我不太明白你的问题(发布一些不起作用的代码会大大提高你获得答案的机会)我会试一试。

HttpRequests是无状态的。因此,在调用不同方法之间,您需要保留数据。通常这是使用数据库完成的。

这是开始使用MVC的好资源:http://www.asp.net/mvc

答案 1 :(得分:0)

因为你没有给出整个模型。

要接收模型,您需要根据该模型设置视图,并将其传递给httppost上的控制器。

实施例

<强>控制器

    public ActionResult Create()
    {
        List<EditTableObject> myList = ....*YourList*....
        ViewBag.EditTables = myList;
        ViewModel vm = new ViewModel();
        return View(vm);
    }
    [HttpPost]
    public ActionResult Create(ViewModel myViewModel)
    {
        if(ModelState.IsValid)
        {
          // DO SOMETHING
        }
        else
        {
            return View(myViewModel);
        }
     }

查看

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<namespace.ViewModel>" %>
<% using (Html.BeginForm()) { %>
    <%: Html.AntiForgeryToken() %>
    <%: Html.ValidationSummary(true) %>

        <%: Html.HiddenFor(model => model.ID) %>

        <div class="editor-field">
            <%: Html.DropDownList("TableObject", IEnumerable<SelectListItem>)ViewBag.EditTable,String.Empty)%>
        </div>
<% } %>

答案 2 :(得分:0)

好的,我明白了。

在Razor View中,我将@Html.HiddenFor(modelItem => Model.ID)添加到表格行。 这是在更多背景下:

   @for (int i = 0; i < Model.EditTables.Count; i++)
   {    
    <tr>
        <td>
            @Html.DisplayFor(modelItem => modelItem.EditTables[i].ID)
            @Html.HiddenFor(modelItem => Model.ID)
        </td>
    </tr>
    }

很抱歉我一开始就没有代码。我为一家不高兴的公司工作我在互联网上共享代码所以我必须挑选并小心我发布的内容。