【问题标题】:In the Controller of the MVC3 in the Edit Result Data not being passed back to the View在 MVC3 的控制器中编辑结果数据没有被传递回视图
【发布时间】:2012-10-16 11:40:35
【问题描述】:

我创建了一个下拉列表,可以很好地传递该数据。但是,当我想编辑表单时,GET 操作中的旧值不会填充到表单中。我是 MVC 的新手,所以一个简洁的例子会很棒。更新 - 我想我知道发生了什么,需要帮助解决。 ddl 仅包含我的下拉数据,因此我仅将下拉数据传递给编辑视图中的模型。表单的数据在我的代码下面的变量模型中,如何在视图中传递 ddl 和模型?

这是我在控制器中的代码

public ActionResult Edit(int id)
        {
            var ddl = new Users();
            ddl.DropDowns = userRepository.Getddl("Departments").Select(c => new SelectListItem
            {
                Value = c.DropdownID.ToString(),
                Text = c.DropdownText
            });
                        var model = userRepository.GetUserId(id);
            return View(ddl);
        }

        [HttpPost]
        public ActionResult Edit(Models.Users users)
        {
            userRepository.UpdateUser(users);
            return RedirectToAction("Index");
        }

查看

@model Models.Users

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div id="stylized" class="myform">
    <fieldset>
        <legend>User Account</legend>     

        <div class="editor-label">
            @Html.LabelFor(model => model.UserFullName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserFullName)
            @Html.ValidationMessageFor(model => model.UserFullName)
        </div>
       <br/>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>
        <br/>
         <div class="editor-label">
            @Html.LabelFor(model => model.ProfileName)
        </div>
          <div class="editor-field">
       @Html.DropDownListFor(x=> x.DeptID,new SelectList(Model.DropDowns,"Value","Text"),"Select")      

        </div> 

【问题讨论】:

  • 您指的是哪些旧值?用户 ID 的东西?
  • 当您查看表单中数据的详细信息然后单击编辑时,我希望显示这些详细信息以便用户可以编辑表单。我得到了一张空白表格。在详细信息中,数据在模型中。
  • 请多解释一下?您希望数据出现哪个视图/操作?什么数据?你的视图是什么样子的
  • 当我在详细视图中时,我单击编辑操作。详细视图中的表单中已有数据。当我通过模型时它起作用了,但是我制作了一些我必须传递给视图的下拉列表。所以我想问题是我没有传递模型,而只是传递了下拉数据。我会发布我的观点。

标签: asp.net-mvc-3 controller edit


【解决方案1】:

您将错误的对象传递给您的视图。传递从 Repository 方法获得的用户对象。假设您的 GetUserID 方法返回一个 User 类的对象,并且它在您的用户对象中有一个 DropDowns 属性

 public ActionResult Edit(int id)
 {
     var model = userRepository.GetUserId(id);
     model.DropDowns = userRepository.Getddl("Departments").
                                          Select(c => new SelectListItem
        {
            Value = c.DropdownID.ToString(),
            Text = c.DropdownText
        });                      
     return View(model);
 }

【讨论】:

  • 嗨 Shyju,在我单击详细视图中的编辑按钮后,我来到了一个空白表单...我希望数据保留在该表单中。我的 Httppost 工作正常。
【解决方案2】:

您正在向视图传递一个新的(空的)User。您想将模型传递给视图。

return View(model);

【讨论】:

  • 正确....但是我如何传递模型和 ddl。换句话说,我将如何将 ddl 添加到要传递的模型中。
  • 创建一个包含所有你需要的属性的视图模型。在您的控制器操作中填充它并将其传递给视图。
【解决方案3】:

如果我正确理解您的问题,您的编辑视图未显示用户数据。相反,它显示一个空白表单,就好像它是一个“新”操作?

我认为您将错误的模型传递给您的视图 - 您应该传递模型,但您传递的是 ddl -(ddl 是新用户)。

您可以通过 viewbag 传递您的下拉列表,或者创建一个包含您的用户和下拉列表的视图模型

【讨论】:

    【解决方案4】:

    您需要将模型和 DropDownList 传递到视图中。主要对象应该是模型,因为这是您的视图所依据的。但是,由于您还需要将 DropDownList 放入视图中,您可以将其附加到模型或通过 ViewBag 添加它:

    public ActionResult Edit(int id)
    {
       var ddl = new Users();
       ddl.DropDowns = userRepository.Getddl("Departments").Select(c => new SelectListItem
       {
           Value = c.DropdownID.ToString(),
           Text = c.DropdownText
       });
    
       var model = userRepository.GetUserId(id);
    
       // When accessing this from the view, you will
       // call it by ViewBag.DepartmentsDropdown
       ViewBag.DepartmentsDropdown = dll;
    
       return View(model);
    }
    

    【讨论】:

    • 以下是我在编辑视图中获取 DropDown 的方式。 @Html.DropDownListFor(x=> x.DeptID,new SelectList(Model.DropDowns,"Value","Text"),"Select") 。所以我会用 ViewBag.DepartmentsDropdown 替换它?
    • @StoneTempleAviators:该视图用于编辑我认为的用户(基于上下文),因此模型应该与用户有关,而不是下拉菜单中的内容。所以,是的,除非您想将下拉列表放入模型中,否则您需要将其更改为 ViewBag.DepartmentsDropdown。
    • 好吧,我是这样做的:@Html.DropDownListFor(x=> x.DeptID,new SelectList(@ViewBag.DepartmentsDropdown,"Value","Text"),"Select") 和那个没用。所以我只是做了一个简单的@ViewBag.DeparmentDropdown,它在我的页面上显示了.. Model.Users。
    【解决方案5】:

    创建例如。 UsersViewModel 类,将 SelectList 等属性添加到提要下拉列表、用户列表和您希望传递到视图中的所有其他数据。 在返回该类的视图初始化实例之前,设置属性并将其作为模型传递。

    ..
    var model = new UsersViewModel
    {
       Users = new SelectList(..),
       ...
    }
    return View(model);
    

    然后在您的视图中,您可以引用来自该 ViewModel 的所有对象。

    【讨论】:

      【解决方案6】:

      好的,感谢大家的意见,我能够解决它。我不想重新创建我拥有的模型。我没有看到数据的原因是因为我没有通过模型。所以我必须创建 ViewData 来保存我的下拉信息。事后看来,最好花更多时间在模型上,这样我就不会遇到这样的问题。没有大家的帮助,我不会得到这个。

      在控制器中

      ViewData["DepartmentDD"] = new SelectList(ddl.DropDowns, "Value", "Text");
      

      在视图中

      @Html.DropDownListFor(model => model.DeptID, (SelectList)ViewData["DepartmentDD"], "Choose one")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 2012-04-03
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多