0

我创建了一个下拉列表,可以很好地传递该数据。但是,当我想编辑表单时,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> 
4

6 回答 6

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);
 }
于 2012-10-16T12:15:37.117 回答
1

您需要将模型和 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);
}
于 2012-10-16T12:16:54.213 回答
1

you're passing a new (empty) User to the view. You want to pass the model to the view instead.

return View(model);
于 2012-10-16T12:09:35.827 回答
1

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

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

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

于 2012-10-16T12:12:45.247 回答
0

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

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

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

于 2012-10-16T12:20:47.437 回答
0

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

在控制器中

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

在视图中

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

于 2012-10-16T13:03:18.783 回答