我们正在使用动态视图来显示和编辑记录。
说我有模特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;这是一个很好的建议,但在我的情况下,下拉项应该是另一个模型的一部分。
答案 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 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>
}
我就是这样做的。您可以修改代码以适应您的方案。
我希望这会有所帮助。
答案 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();
}