2个不同的模型需要使用相同的视图

时间:2015-10-26 00:07:10

标签: asp.net asp.net-mvc asp.net-mvc-4 razor models

让我先说这是因为我正在从经典ASP转换为.net,所以我的.net知识全是通过书籍而不是使用。我正在购物车平台上工作,我们的任务是创建3种不同的显示类型(水平滑块,垂直滑块和网格),可以被2种不同的型号使用。

我得到了新视图以使用我的第一个模型,并认为我是清楚的并插入第二个,但后来我开始得到关于模型不一样的错误。我试图找出处理这个的最佳方法。我提出的解决方案是

  1. 使用视图模型 - 这似乎只能在你需要将两个模型组合成一个时使用,而这实际上与我需要的相反,我需要使1个视图工作2模型。

  2. 为每种类型制作单独的视图。这似乎是合乎逻辑的,但是会产生5个与我已经创建的几乎相同的新视图文件,这似乎是多余的。

  3. 使用renderPartial并转换模型 - 我不确定如何实现这一点,但我的目的是渲染部分创建实际显示(水平滑块,垂直滑块和网格视图)

  4. 我很难确定最佳行动方案是什么。我知道,对于MVC和.net,你应该永远不会对同一个东西进行两次编码,我认为制作单独的视图正是这样做的。任何有关如何最好地接近这一点的想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

这就是我现在在项目中这样做的方式,我不知道这是不是最好的方式,但对我来说工作正常。

基本上在我网站的主页上,我需要有2个不同的模型来处理2个表单发布到控制器中的同一个方法

namespace Website.Models.ViewModels
{
    public class HomePageModels
    {
        public SearchFlyModel SearchFly { get; set; }
        public CarRequestModel CarRequest { get; set; }      
        public int form { get; set; }

        public HomePageModels()
        {
            SearchFly = new SearchFlyModel();
            CarRequest = new CarRequestModel();
        }
    }
}

然后在控制器的方法上,我需要知道发布了哪个表单以了解我需要验证的表单,因为Asp.net会自动验证模型,默认情况下会验证ViewModel中的两个模型,这会影响ModelState,当您检查模型是否在执行ModelState.isValid时是有效的,这将返回false,因为您只发布了一个表单而不是另一个完全为空的表单。

要管理它,我会执行以下操作

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(HomePageModels model)
        {
            ModelState.Clear();

            if (model.form == 0)
            {
                try
                {                                        
                    ValidateModel(model.SearchFly);
                    return this.SearchFly(model.SearchFly);
                }
                catch (Exception e)
                {

                }
            }
            else
            {
                try
                {
                    ValidateModel(model.CarRequest);
                    return this.SearchCar(model.CarRequest);
                }
                catch (Exception e)
                {

                }
            }


            var modelHomePage = new HomePageModels()
            {
                SearchFly = model.SearchFly,
                CarRequest = model.CarRequest,
                form=model.form
            };
            return View(modelHomePage);
        }

两个表单都发布到同一个操作,因为我需要返回表单的验证错误,以便用户可以修复它。