C# 如何正确测试模型I';m传递给我的控制器的是特定类型的吗?

C# 如何正确测试模型I';m传递给我的控制器的是特定类型的吗?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我有一个视图,上面有多个表单。这些表单具有使用Html.RenderPartial()添加的部分视图。我希望能够在单个actionResult中区分模型: [HttpPost] public ActionResult LogOn(dynamic Model, string returnUrl) { if (Model is RegisterModel) { Register((RegisterModel)Model,

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

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

这有什么原因不起作用吗?我还尝试将模型作为对象而不是动态输入,但这也没有帮助。Model.GetType()始终返回对象,Model为RegisterModel始终返回false。我在这里需要了解的MVC3的行为中缺少了什么?感谢您抽出时间

首先,为什么不为不同的型号创建不同的操作方法呢? 这将导致更好的性能和更好的“关注分离” 但是如果你想按照你描述的方式来做,试试这个

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

它被静态类型化为动态类型

您可以创建一个自定义模型绑定器,尝试绑定您的模型 发布或获取所需类型的信息

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就dynamic关键字写了一篇很好的博客文章:

有关IModelBinder的更多信息:


希望这有帮助

什么返回Model.GetType().Name?顺便问一下,为什么您使用动态作为模型类型?不熟悉MVC,但您能将其作为通用函数吗?类似于登录(T Model,string returnUrl)?Model.GetType().Name作为“对象”返回。我使用动态作为模型类型,因为我被引导相信MVC3大量使用动态,而对象不起作用。所以我想我应该试一试。我对mvc3的细节了解不够,不知道这里到底传递了什么,为什么is关键字在这种情况下不起作用谁在调用LogOn方法?为什么你认为模型应该是特定类型的,而不是一些原始的装箱/包装为对象的东西?我不确定这不是怎么回事。我只是想要一个比try/catch更好的解决方案,并正确理解MVC3的行为。是的,我理解,但根据msdn,在这种情况下,如果传入的对象可转换为RegisterModel(如果我理解正确),则动态类型的某些内容应与is一起工作并生成true。我在看到您的评论前几秒钟更改了答案。这对你们有帮助吗?若你们看我原来的问题,我实际上已经用同样的结果试过了。同样,dynamic在这里也以同样的方式被成功地使用,我认为这个问题与mvc3实际传递给它的操作有关,这是正确的。MVC会尝试将信息绑定到您的类型。因此,您可以创建一个ModelBinder类来为您创建正确的类型。我现在要修改我的答案。这看起来很有帮助,为了正确地遵循mvc模式,这个类会去哪里?它符合模特儿的条件吗?