【问题标题】:ASP.NET MVC: Passing several objects to the view including a validation modelASP.NET MVC:将多个对象传递给视图,包括验证模型
【发布时间】:2010-08-24 07:20:03
【问题描述】:

我喜欢使用模型进行验证

<!-- ViewPage -->

<%@ Page Language="C#" Inherits="ViewPage<TopicModel>" %>

...

<%= Html.TextBoxFor(m => m.Title) %>

...

<%= Html.TextBoxFor(m => m.Description) %>


// Controller

[HttpPost]
public ActionResult NewTopic(TopicModel model)
{
     // validate
}

效果很好,但是当我需要传递额外的数据时,我需要创建一个新的 ViewModel 类并且我失去了灵活性。

<!-- ViewPage -->

<%@ Page Language="C#" Inherits="ViewPage<TopicViewModel>" %>

<%= Model.SomethingImportant %>

...

<%= Html.TextBoxFor(m => m.TopicModel.Title) %> // UGLY, I get name="TopicViewModel.TopicModel.Title"

...

<%= Html.TextBoxFor(m => m.TopicModel.Description) %> // UGLY, same thing


// Controller

[HttpPost]
public ActionResult NewTopic(TopicViewModel model)
{
     // validate
     var validationModel = model.TopicModel; // UGLY
}

我怎样才能使它更容易和更好看?

【问题讨论】:

  • 创建视图模型会失去什么灵活性?为什么你认为拥有name="TopicModel.Title" 很丑?

标签: asp.net-mvc validation models viewdata


【解决方案1】:

您是否考虑过将 ViewData 字典用于模型之外的其他数据?

更新或者,让您的视图模型成为您的模型的子类并添加额外的属性,但保留基类的验证。

【讨论】:

  • 这意味着我必须强制转换对象,这不是执行 ASP.NET MVC 的好方法。
  • 然后你可以让你的视图模型成为你的模型的子类并添加额外的属性,但保留基类的验证。
  • 谢谢!不是它很好用。非常简单的解决方案。 (请更新您的评论,以便其他人可以看到这个问题是如何解决的。)
【解决方案2】:

你说的第二个例子看起来很丑,实际上是比使用 ViewData 更好的做事方式。

模型的想法是它包含视图在呈现时所需的“东西” - 因此它是放置视图所需的所有数据项的理想场所。

如果您真的对命名约定(框架使用它从表单帖子重新填充您的模型)感到不快,您可以展平模型。这将为每个项目提供“漂亮”的名称,但会无缘无故地进行大量工作。

【讨论】:

  • “扁平化模型”是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2011-01-13
  • 2017-02-18
  • 2011-12-21
相关资源
最近更新 更多