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

tgm*_*dbm 13 c# asp.net-mvc

添加视图和编辑视图通常非常相似,因此写入2个视图是没有根据的.随着应用程序的发展,您将对两者进行相同的更改.

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

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

或者,还有更好的方法?

Ben*_*man 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);
   }

   ....

}
Run Code Online (Sandbox Code Playgroud)

以下是观点:

<% 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") %>
<% } %>
Run Code Online (Sandbox Code Playgroud)

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

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");
}
Run Code Online (Sandbox Code Playgroud)


And*_*mer 4

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

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

我喜欢 asp.net mvc,但它仍处于成熟阶段,仍然需要添加更多糖分来消除创建网站的一些障碍。