ASP.NETMVC可以帮助我在操作中将ID转换为模型吗
本文关键字:ID 转换 模型 操作 NETMVC 帮助 ASP | 更新日期: 2023-09-27 18:26:57
考虑以以下方式构建HTML表单:
<select name="schoolType">
@foreach (SchoolType schoolType in Model.SchoolTypes)
{
<option value="@schoolType.Id">@schoolType.Name</option>
}
</select>
现在,SchoolType是一个模范班。它是在我的EDMX for Entity Framework中设计的。
在上面的场景中,现在,我的操作方法如下:
public ActionResult CreateSchool(int schoolType)
{
...
SchoolType myType = container.SchoolTypeSet.FirstOrDefault(t => t.Id == schoolType);
...
}
是否可以编程某种帮助程序,以便MVC自动知道将整数转换为具有该ID的Model类,如以下操作方法签名?
public ActionResult CreateSchool(SchoolType schoolType)
{
...
}
您可以使用ModelBinder来实现这一点:
public ActionResult CreateSchool([ModelBinder(typeof(SchoolTypeBinder))] SchoolType schoolType)
{
...
}
模型活页夹的外观:
public class SchoolTypeBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
SchoolType output = null;
int id;
ValueProviderResult parameter = bindingContext.ValueProvider.GetValue("id");
if (parameter != null)
{
id = (int)parameter.ConvertTo(typeof(int));
output = container.SchoolTypeSet.FirstOrDefault(t => t.Id == id);
}
return output;
}
}
您还可以在启动时将绑定器与全局类型关联:
protected void Application_Start()
{
...
ModelBinders.Binders.Add(typeof(SchoolType), new SchoolTypeBinder());
}
产生了你要求的漂亮、干净的动作:
public ActionResult CreateSchool(SchoolType schoolType)
{
...
}
我通常将其封装在一个名为DataSource的抽象中,该抽象公开当前值和当前id。只要主键在整个解决方案中通常是相同的类型(int,Guid),就可以为数据源注册模型绑定器。你可以使用下面这样的助手将其输出到你的视图:
public static SelectList ToSelectList<T, T1>(this DataSource<T, T1> dataSource)
{
return dataSource == null
? new SelectList(Enumerable.Empty<string>())
: new SelectList(dataSource, "Key", "Value", dataSource.CurrentValue);
}
在编辑器模板中,您可以使用@Html.DropDownListFor(model=>model,model.ToSelectList())