C# 如何正确测试模型I';m传递给我的控制器的是特定类型的吗?
我有一个视图,上面有多个表单。这些表单具有使用Html.RenderPartial()添加的部分视图。我希望能够在单个actionResult中区分模型: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,
[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模式,这个类会去哪里?它符合模特儿的条件吗?