【问题标题】:Using ASP.NET MVC, how to best avoid writing both the Add View and Edit View?使用 ASP.NET MVC,如何最好地避免同时编写添加视图和编辑视图?
【发布时间】:2010-09-06 08:01:09
【问题描述】:

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

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

那么,我是否应该创建一个包含两个视图的所有信息的视图数据类,其中,根据您正在执行的操作,某些属性将为空?
我是否应该将视图数据中的操作作为枚举包含在内?
我应该用 包围所有细微的差异吗?

或者有没有更好的方法?

【问题讨论】:

  • 是的!如果能够将相同的视图用于:添加、编辑和查看...

标签: c# asp.net-mvc


【解决方案1】:

真的很简单。假设您正在编辑博客文章。

这是您的 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");
}

【讨论】:

  • 与其重新发布你所做的事情,我可能会建议你编辑你的答案,包括一个在编辑屏幕上将字段切换为只读的示例,正​​如原始问题所询问的那样.
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        相关资源
        最近更新 更多