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)
    {
        ...
    }

ASP.NETMVC可以帮助我在操作中将ID转换为模型吗

您可以使用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())