我们使用动态视图来显示和编辑记录。
假设我有一个模型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的组织is是表A中的外键。
现在我有了动态编辑器视图,
@model dynamic
@using (Html.BeginForm("Edit", null, FormMethod.Post))
{
@Html.EditorForModel()
<input type="submit" value="Edit" />
}
如果我们选择编辑任何A的记录,它将显示带有所有文本框的编辑器视图。但是对于organizationid,我不应该在其中显示整数值。相反,我应该显示一个下拉列表,其中包含表B的可用组织,用户可以从中选择一个组织进行编辑。
我该怎么处理呢?我阅读了Darin的answers here;这是一个很好的建议,但在我的例子中,下拉项应该是另一个模型的一部分。
发布于 2013-07-16 16:32:44
如果我以你建议的方式解决这个问题,那么我会对A进行更改。如果你不打算使用视图模型,那么你将需要扩展它的属性。
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
发布于 2013-07-16 14:47:41
我不太确定我是否正确理解了你的问题。我从不使用EditorFor
,我只是直接从视图模型添加字段。它给了我更多的控制权。据我所知,您似乎想要编辑class A
并将class B
放在下拉列表中?
这就是我将如何定义class A
和class B
,给出您的属性的名称,如果我错了,请原谅。class A is class User
和class 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>
}
我就是这么做的。您可以修改代码以适应您的场景。
我希望这能帮到你。
https://stackoverflow.com/questions/17668733
复制相似问题