13

Add 视图和 Edit 视图通常非常相似,没有必要编写 2 个视图。随着应用程序的发展,您将对两者进行相同的更改。

但是,通常存在细微差别。例如,一个字段在添加后可能是只读的,如果该字段是 DropDownList,则您不再需要 ViewData 中的该列表。

那么,我是否应该创建一个包含两个视图的所有信息的视图数据类,其中,根据您正在执行的操作,某些属性将为空?
我是否应该将视图数据中的操作作为枚举包含在内?我应该用<% if( ViewData.Model.Op == Ops.Editing ) { %>
包围所有细微的差异吗?

或者,还有更好的方法?

4

4 回答 4

5

这真的很容易。假设您正在编辑博客文章。

这是您的 2 个新建/编辑操作:

public class BlogController : Controller
{
   public ActionResult New()
   {
      var post = new Post();
      return View("Edit", post);
   }

   public ActionResult Edit(int id)
   {
      var post = _repository.Get(id);
      return View(post);
   }

   ....

}

这是视图:

<% using(Html.Form("save")) { %>
<%= Html.Hidden("Id") %>

<label for="Title">Title</label>
<%= Html.TextBox("Title") %>

<label for="Body">Body</label>
<%= Html.TextArea("Body") %>

<%= Html.Submit("Submit") %>
<% } %>

这是视图提交到的保存操作:

public ActionResult Save(int id, string title, string body)
{
   var post = id == 0 ? new Post() : _repository.Get(id);
   post.Title = title;
   post.Body = body;

   _repository.Save(post);

   return RedirectToAction("list");
}
于 2008-09-03T15:01:12.057 回答
4

我不喜欢视图变得太复杂,到目前为止,我倾向于为编辑和添加设置单独的视图。我使用用户控件来存储公共元素以避免重复。两个视图都以相同的 ViewData 为中心,并且我的数据上有一个标记来说明对象是新对象还是现有对象。

这并不比您规定的更优雅,所以我想知道是否有任何 Django 或 Rails 人员可以提供任何输入。

我喜欢 asp.net mvc,但它仍在成熟,仍然需要添加更多的糖来消除创建网站的一些摩擦。

于 2008-08-20T21:18:52.340 回答
2

我个人只是更喜欢在视图中使用 if/else。它帮助我立即看到正在发生的一切。

如果你想避免标签汤,我建议创建一个辅助方法。

<%= Helper.ProfessionField() %>

string ProfessionField()
{
    if(IsNewItem) { return /* some drop down code */ }
    else { return "<p>" + _profession+ "</p>"; }        
}
于 2008-08-20T22:02:52.873 回答
1

您可以在此处指定 CustomViewData 类并传递参数。


public class MyViewData {
    public bool IsReadOnly { get; set; }
    public ModelObject MyObject { get; set; }
}

并且两个视图都应该实现这个 ViewData。因此,您可以使用提供的 IsReadOnly 属性来管理 UserControl 结果。

由于控制器使用它,您可以对其进行单元测试并且您的视图没有实现,因此您可以尊重 MVC 原则。

于 2008-11-14T17:46:55.723 回答