ASP.NET模型绑定到ProfileCommon

时间:2009-09-02 06:34:42

标签: asp.net-mvc

我想知道是否有一个很好的示例,说明如何使用模型绑定在MVC中编辑ASP.NET配置文件设置。

目前我有:

  • 从ProfileBase派生的自定义ProfileCommon类。
  • 强类型视图(类型为ProfileCommon)
  • 在与ProfileCommon和关联视图一起使用的控制器上获取和发布操作。 (见下面的代码)。

查看配置文件详细信息有效 - 表单中会显示正确填充的所有字段。

保存表单会产生异常:System.Configuration.SettingsPropertyNotFoundException:找不到设置属性“FullName”。

考虑到这一点是有道理的,因为模型绑定将实例化ProfileCommon类本身而不是抓取其中一个httpcontext。此外,保存可能是多余的,因为我认为配置文件在修改时会自动保存 - 在这种情况下,即使验证失败也是如此。正确?

无论如何,我目前的想法是我可能需要为模型绑定创建一个单独的Profile类,但是当我已经有一个非常相似的类时,它似乎有点多余。

在某个地方有一个很好的例子吗?

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit()
    {
        return View(HttpContext.Profile);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(ProfileCommon p)
    {
        if (ModelState.IsValid)
        {
            p.Save();
            return RedirectToAction("Index", "Home");
        }
        else
        {
            return View(p);
        }
    }

1 个答案:

答案 0 :(得分:3)

当你说在后期场景中从头开始创建ProfileCommon实例(而不是从HttpContext创建)时,这听起来是正确的 - 这就是DefaultModelBinder的作用:它根据默认构造函数创建一个新类型的实例。

我认为你可以通过创建一个类似这样的自定义IModelBinder来解决这个问题:

public class ProfileBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        return controllerContext.HttpContext.Profile;
    }
}

您可能需要进行一些强制转换才能使其适合您的个人资料类。

要使用此ProfileBinder,您可以将其添加到Edit控件操作中,如下所示:

public ActionResult Edit([ModelBinder(typeof(ProfileBinder))] ProfileCommon p)