1

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

假设我有一个模型 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 的组织 ID 是表 A 中的外键。

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

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

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

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

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

4

3 回答 3

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。

高温高压

于 2013-07-16T08:32:44.333 回答
0

我不太确定我是否正确理解了你的问题。我从不使用EditorFor,我只是直接从视图模型中添加字段。它给了我更多的控制权。据我所知,您似乎想编辑class Aclass 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>
}

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

我希望这有帮助。

于 2013-07-16T06:47:40.840 回答
0

嗨试试这样

模型

  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();
        }
于 2013-07-17T06:55:07.403 回答