我怎样才能正确地测试我传递给控制器的模型是否属于特定类型?

本文关键字:是否 模型 属于 类型 控制器 正确地 测试 | 更新日期: 2023-09-27 18:16:03

我有一个视图上有多个形式。这些表单有使用Html.RenderPartial()添加的部分视图。我希望能够在单个actionResult中区分模型:

    [HttpPost]
    public ActionResult LogOn(dynamic Model, string returnUrl)
    {
        if (Model is RegisterModel)
        {
            Register((RegisterModel)Model, returnUrl);
        }
        return View();
    }

有什么原因导致这不起作用吗?我也尝试过将Model作为对象而不是动态的,但这也没有帮助。Model. gettype()总是返回object, Model is RegisterModel总是返回false。关于MVC3的行为,我还遗漏了什么需要了解的?感谢您的宝贵时间

我怎样才能正确地测试我传递给控制器的模型是否属于特定类型?

首先,为什么不为不同的modeltype创建不同的Action Methods呢?这将带来更好的性能和更好的"关注点分离"。但是如果你想按照你描述的方式来做,试试这个…

也许这听起来很奇怪,但是

静态类型为动态类型

您可以创建一个自定义模型绑定器来尝试绑定您的POST或GET信息到您想要的类型。

public class MyCustomModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        object result;
        HttpRequestBase request = controllerContext.HttpContext.Request;
        // custom logic sample
        if (request.Params["ParamName"].ToString() == "xyz")
        {
            result = new RegisterModel();
            result.Propertie1 = request.Params["Propertie1"];
        }
        else
        {
            // create another model
        }
        return result;
    }
}

那么你可以这样做。

[HttpPost]
public ActionResult LogOn([ModelBinder(typeof(MyCustomModelBinder))] object Model, string returnUrl)
{
    if (Model is RegisterModel)
    {
        Register((RegisterModel)Model, returnUrl);
    }
    return View();
}

Scott Hanselman写了一篇关于动态关键字的博文:c# 4与动态关键字

关于IModelBinder的更多信息:. NET MVC自定义模型绑定

希望对您有所帮助