下载动态视图mvc4

时间:2013-07-16 05:34:31

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

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

说我有模特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的记录,它将显示包含所有文本框的编辑器视图。但是对于organizationid,我不应该在其中显示整数值。 相反,我应该向表B的可用组织显示一个下拉列表,用户可以选择其中一个进行编辑。

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

3 个答案:

答案 0 :(得分:1)

如果我以你建议的方式处理这个问题,那么我会改变A.如果你不打算使用viewmodel,那么你需要扩展它的属性。

public class A
{

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


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

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

我还将原始的organizationid设置为不被搭建,所以希望这会阻止它参与渲染过程。

您当然需要在editortemplates中制作模板DropDownList。

HTH

答案 1 :(得分:0)

我不太确定我是否正确理解你的问题。我从不使用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>
}

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

我希望这会有所帮助。

答案 2 :(得分: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--")

<强> Contrller

[HttpGet]
        public ActionResult CustomerInfo()
        {

            var List = GetCustomerName();
            ViewBag.CustomerNameID = new SelectList(List, "CustomerId", "customerName");
            return View();
        }