【问题标题】:Dropdown in dynamic views mvc4动态视图中的下拉菜单 mvc4
【发布时间】:2013-07-16 05:34:30
【问题描述】:

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

假设我有一个模型 A:

public class A
{
    public int AID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int organizationid { get; set; }
}

B 类:

public class B
{
    public int organizationid { get; set; }
    public string orgnmae { get; set; }
    public string orgdesc { get; set; }
}

这里表B的organizationid是表A的外键

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

@model dynamic
@using (Html.BeginForm("Edit", null,  FormMethod.Post))
 {
   @Html.EditorForModel()

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

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

我该如何处理?我读了达林的answers here;这是一个很好的建议,但在我的情况下,下拉项目应该是另一个模型的一部分。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


    【解决方案1】:

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

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

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

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

    您当然需要在您的编辑器模板中制作模板 DropDownList。

    HTH

    【讨论】:

    • 我想我的模型类中不能有 IEnumerable 。因为它需要 system.web.mvc 命名空间,我不能在我的 BIz 项目中添加这个程序集..
    • 啊,没什么大不了的,您可以传递该列表中的任何类型,您只需能够将其转换为选择列表项即可
    • 你需要有一个通用类型,你的 DropDownList 模板可以绑定到下拉列表中,然后你想成为下拉列表的任何实体都需要转换为这种类型,很可能是通过隐式运算符或适配器模式。您可以选择更适合您的方法
    • 恐怕这将是一个谷歌和搜索工作,你可以寻找隐式运算符和转换列表等内容。恐怕我在工作,所以不能在 mo 上敲出样本跨度>
    • 没有问题..谢谢4指导..我会看看并更新你:)
    【解决方案2】:

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

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

    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; }
    }
    

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

    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
    }
    

    这就是你的视图的样子。

    @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>
    }
    

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

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的详细回答。但是您的视图是强类型的,在我看来是动态视图。请参阅我的问题中的观点。现在我有一个“EditUserViewModel”对象,我怎样才能在动态视图中通过下拉菜单显示它,你能解释一下吗?
    • 动态视图是什么意思?为什么需要@model dynamicViews should be strongly typed.
    • 如您所知,视图可以通过两种方式呈现:1) 强类型 2) 动态。我可以将任何对象传递给它应该处理这些对象的动态视图(比如用户或部门)。所以我们使用动态视图。
    【解决方案3】:

    你好试试这样

    型号

      public class CustomerModel
        {
            public int CustomerId { get; set; }
    
            public string customerName { get; set; }
    }
    

    查看

    @model dynamic
    @{
        Layout = null;
    }
    
     @Html.DropDownList("CustomerId", (SelectList) ViewBag.CustomerNameID,"--Select--")
    

    控制器

    [HttpGet]
            public ActionResult CustomerInfo()
            {
    
                var List = GetCustomerName();
                ViewBag.CustomerNameID = new SelectList(List, "CustomerId", "customerName");
                return View();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多