使用ASP.NET MVC,如何最好地避免写入添加视图和编辑视图?


13

添加视图和编辑视图通常令人难以置信的相似,它是没有理由写2视图。随着应用程序的发展,您将对两者进行相同的更改。

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

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

或者还有更好的方法吗?

  0

是啊!能够使用相同的视图可以很好:添加,编辑和查看... 14 11月. 082008-11-14 17:56:24

4

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

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

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


2

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

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

<%= Helper.ProfessionField() %> 

string ProfessionField() 
{ 
    if(IsNewItem) { return /* some drop down code */ } 
    else { return "<p>" + _profession+ "</p>"; }   
} 

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"); 
} 
  0

与原来的问题一样,我可能会建议您编辑您的答案,以包含在编辑屏幕上将字段切换为只读的示例。 11 12月. 092009-12-11 13:55:54


1

您可以指定一个CustomViewData类并在这里传递参数。


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

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

由于控制器使用它,你可以对它进行单元测试,并且你的视图没有实现,所以你可以遵守MVC的原则。