将不同类型的ViewModel返回到控制器

本文关键字:返回 控制器 ViewModel 同类型 | 更新日期: 2023-09-27 18:27:48

我有一个ASP.NET MVC4应用程序,其中某个位置有一个页面(索引),用户可以在其中从DropDownList中选择项目。提交后,控制器将根据列表中选定的项目,向另一个视图返回不同的PartialView名称(创建)。每个分部都有自己的ViewModel,当PartialView从控制器发送到Create-View时,它会被正确渲染。为了实现这一点,我制作了一个通用ViewModel和从该通用ViewModel派生的其他几个视图模型。Create-视图的普通ViewModel为Model,而将在Create-视图中渲染的Partials具有匹配的派生类型为Model。

但问题是,当我在PartialView上提交表单时,我必须在Controller中检索正确的ViewModel。接受普通ViewModel作为参数是行不通的,因为那时我无法将其向下转换为正确的ViewModel。下面是我的一些示例代码:

视图模型:

public class PropertyViewModel
{
    public string ViewName { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }
}
public class IntegerViewModel : PropertyViewModel
{
    public int MinValue { get; set; }
    public int MaxValue { get; set; }
}
public class TextViewModel : PropertyViewModel
{
    public int MaxLength { get; set; }
}

控制器:

public ActionResult Create(String partialName)
{
    var model = GetViewModelFromName(partialName);
    return View(model);
}
[HttpPost]
public ActionResult Create(???)
{
    //What to do here and what kind of parameter should I expect?
}

有"干净"的方法吗?有人知道如何做到这一点吗?

更新:

我有一个似乎有效的解决方案。在PartialView中,我设置了表单的actionName和controllerName,如下所示:

@using (Html.BeginForm("CreateIntegerProperty", "Property")) {
    //Formstuff...
}
@using (Html.BeginForm("CreateTextProperty", "Property")) {
    //Formstuff...
}

在我的控制器中,我有所有不同的操作(每个PartialView一个)。这似乎奏效了。这是一种干净的方法吗?如果有人想出更好的主意,请告诉我!

将不同类型的ViewModel返回到控制器

如果你的解决方案有效,那就用它吧。这对我来说似乎很好。唯一的问题是,如果你为每个操作都有相同的URL而烦恼的话。

如果你想的话,你可以通过在基本ViewModel中添加Action和Controller名称来稍微增强它,比如这样:

public class PropertyViewModel
{
    public string ViewName { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }
    public String Controller { get; set; }
    public String Action { get; set; }
}

然后这样做:

@using (Html.BeginForm(Model.Action, Model.Controller)) {
    //Formstuff...
}

如果这意味着你现在可以对表单使用相同的View(或部分视图,或其他什么),那么这将是值得的

如果您确实希望每个操作都有相同的URL,那么一种方法是覆盖OnModelBinding,但我个人可能不会这么麻烦。