让我先说这是因为我正在从经典ASP转换为.net,所以我的.net知识全是通过书籍而不是使用。我正在购物车平台上工作,我们的任务是创建3种不同的显示类型(水平滑块,垂直滑块和网格),可以被2种不同的型号使用。
我得到了新视图以使用我的第一个模型,并认为我是清楚的并插入第二个,但后来我开始得到关于模型不一样的错误。我试图找出处理这个的最佳方法。我提出的解决方案是
使用视图模型 - 这似乎只能在你需要将两个模型组合成一个时使用,而这实际上与我需要的相反,我需要使1个视图工作2模型。
为每种类型制作单独的视图。这似乎是合乎逻辑的,但是会产生5个与我已经创建的几乎相同的新视图文件,这似乎是多余的。
使用renderPartial并转换模型 - 我不确定如何实现这一点,但我的目的是渲染部分创建实际显示(水平滑块,垂直滑块和网格视图)
我很难确定最佳行动方案是什么。我知道,对于MVC和.net,你应该永远不会对同一个东西进行两次编码,我认为制作单独的视图正是这样做的。任何有关如何最好地接近这一点的想法将不胜感激。
答案 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);
}
两个表单都发布到同一个操作,因为我需要返回表单的验证错误,以便用户可以修复它。