我怎样才能正确地测试我传递给控制器的模型是否属于特定类型?
本文关键字:是否 模型 属于 类型 控制器 正确地 测试 | 更新日期: 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自定义模型绑定
希望对您有所帮助