首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >动态视图mvc4中的下拉列表

动态视图mvc4中的下拉列表
EN

Stack Overflow用户
提问于 2013-07-16 13:34:31
回答 2查看 1K关注 0票数 1

我们使用动态视图来显示和编辑记录。

假设我有一个模型A:

代码语言:javascript
复制
public class A
{
    public int AID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int organizationid { get; set; }
}

和B类:

代码语言:javascript
复制
public class B
{
    public int organizationid { get; set; }
    public string orgnmae { get; set; }
    public string orgdesc { get; set; }
}

这里,表B的组织is是表A中的外键。

现在我有了动态编辑器视图,

代码语言:javascript
复制
@model dynamic
@using (Html.BeginForm("Edit", null,  FormMethod.Post))
 {
   @Html.EditorForModel()

 <input type="submit" value="Edit" />
}

如果我们选择编辑任何A的记录,它将显示带有所有文本框的编辑器视图。但是对于organizationid,我不应该在其中显示整数值。相反,我应该显示一个下拉列表,其中包含表B的可用组织,用户可以从中选择一个组织进行编辑。

我该怎么处理呢?我阅读了Darin的answers here;这是一个很好的建议,但在我的例子中,下拉项应该是另一个模型的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-16 16:32:44

如果我以你建议的方式解决这个问题,那么我会对A进行更改。如果你不打算使用视图模型,那么你将需要扩展它的属性。

代码语言:javascript
复制
public class A
{

    [ScaffoldColumn(false)]
    public int OrganizationId { get; set; }


    [Display(Name="OrganizationId")]
    [UIHint("DropDownList")]
    public IEnumerable<SelectListItem> Organizations { get; set; }
}

您会注意到,我覆盖了组织的name字段,以便将值作为OrganizationId反馈到模型绑定中。当您构建此模型时,您将创建orgranizations属性,将其作为相关组织实例中的selectlistitems的列表或数组。

我还将原始organizationid设置为不脚手架,因此希望这将阻止它参与渲染过程。

当然,你需要在你的编辑器模板中创建DropDownList模板。

HTH

票数 1
EN

Stack Overflow用户

发布于 2013-07-16 14:47:41

我不太确定我是否正确理解了你的问题。我从不使用EditorFor,我只是直接从视图模型添加字段。它给了我更多的控制权。据我所知,您似乎想要编辑class A并将class B放在下拉列表中?

这就是我将如何定义class Aclass B,给出您的属性的名称,如果我错了,请原谅。class A is class Userclass B is class Organization。你需要给你的属性更好的描述,这样人们才能更好地阅读它们。

代码语言:javascript
复制
public class User
{
     public int UserId { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public int OrganizationId { get; set; }
}

public class Organization
{
     public int OrganizationId { get; set; }

     public string OrganizationName { get; set; }

     public string OrganizationDescription { get; set; }
}

您需要有一个视图模型来在视图上表示数据。

代码语言:javascript
复制
public class EditUserViewModel
{
     public int UserId { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public int OrganizationId { get; set; }

     public IEnumerable<Organization> Organizations { get; set; }
}

public ActionResult Edit(int id)
{
     // Get the user by id
     User user = userRepository.GetById(id);

     // You can use a mapping tool here to map from domain model to view model.
     // I did it differently for the sake of simplicity

     EditAViewModel viewModel = new EditAViewModel
     {
          UserId = user.UserId,
          FirstName = user.FirstName,
          LastName = user.LastName,
          OrganizationId = user.OrganizationId,
          Organizations = organizationRepository.GetAll()
     };

     // Return the populated view model to the view    
     return View(viewModel);
}

[HttpPost]
public ActionResult Edit(EditAViewModel viewModel)
{
     if (!ModelState.IsValid)
     {
          viewModel.Organizations = organizationRepository.GetAll();

          return View(viewModel);
     }

     // If validation succeeds do what ever you have to do here, like edit in database
}

这是你的视图的样子。

代码语言:javascript
复制
@model YourProject.ViewModels.Users.EditUserViewModel

@using (Html.BeginForm())
{
     <table>
          <tr>
               <td class="edit-label">First Name:</td>
               <td>
                    @Html.TextBoxFor(x => x.FirstName)
                    @Html.ValidationMessageFor(x => x.FirstName)
               </td>
          </tr>
          <tr>
               <td class="edit-label">Last Name:</td>
               <td>
                    @Html.TextBoxFor(x => x.LastName)
                    @Html.ValidationMessageFor(x => x.LastName)
               </td>
          </tr>
          <tr>
               <td class="edit-label">Organization:</td>
               <td>
                    @Html.DropDownListFor(
                         x => x.OrganizationId,
                         new SelectList(Model.Organizations, "OrganizationId", "OrganizationName", Model.OrganizationId),
                         "-- Select --"
                    )
                    @Html.ValidationMessageFor(x => x.OrganizationId)
               </td>
          </tr>
     </table>

     <button id="SaveButton" type="submit">Save</button>
}

我就是这么做的。您可以修改代码以适应您的场景。

我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17668733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档