【问题标题】:2 Different Models Need to Utilize Same View2 不同的模型需要使用相同的视图
【发布时间】:2015-10-26 00:07:09
【问题描述】:

让我假设我正在从 Classic ASP 过渡到 .net,所以我的 .net 知识都是通过书本获得的,而不是使用。我正在开发一个购物车平台,我的任务是创建 3 种不同的显示类型(水平滑块、垂直滑块和网格),它们将能够被 2 种不同的模型使用。

我将新视图用于我的第一个模型,并认为我很清楚并插入了第二个模型,但后来我开始收到关于模型不同的错误。我正在尝试找出处理此问题的最佳方法。我想出的解决方案是

  1. 使用视图模型 - 这似乎只应在您需要将 2 个模型合并为一个时使用,而这实际上与我需要的相反,我需要让 1 个视图为 2 个工作模型。

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

  3. 使用 renderPartial 并转换模型 - 我什至不知道如何实现这一点,但我的想法是在实际显示的创建(水平滑块、垂直滑块和网格视图)中渲染部分

我很难确定最佳行动方案是什么。我知道使用 MVC 和 .net,你不应该对相同的东西进行两次编码,我认为制作单独的视图就是这样做的。任何关于如何最好地解决此问题的想法将不胜感激。

【问题讨论】:

  • 视图是模型的可视化表示,因此如果要显示 2 个不同的模型,则需要 2 个不同的视图(或局部视图)
  • 最初这 2 个不同的模型会各自进入自己的视图,但随后都以相同的视图结束,但它们都以不同的方式发送到相同的视图,其中一个使用了我的 Html.Action猜测用于转换它,而另一个使用 DisplayFor,这就是为什么我认为这可以通过重用相同的视图来完成。
  • 不清楚您上次评论的意思,但如果视图几乎相同,那么您可以将主视图或布局用于常见的 html 和部分视图 (@987654321 @ 或 @Html.Action()EditorTemplates 用于模型特定的 html。
  • ViewModel 旨在封装 View 所需的信息。我不明白你为什么不制作另一个 ViewModel 将你需要的所有东西都封装到一个中?
  • 在一个视图中使用多个模型的最佳方式是局部视图。如果其他模型使用不是主要的,或者你想使用它的一个属性,那么在 action 方法中使用 viewbag 或 viewdata

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


【解决方案1】:

这就是我现在在我的项目中这样做的方式,我不知道这是否是最好的方式,但对我来说效果很好。

基本上在我网站的主页上,我需要使用 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);
        }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多