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

Posted

技术标签:

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

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

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

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

或者有没有更好的方法?

【问题讨论】:

是的!如果能够将相同的视图用于:添加、编辑和查看... 【参考方案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 原则。

【讨论】:

以上是关于使用 ASP.NET MVC,如何最好地避免同时编写添加视图和编辑视图?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 开发人员的 javascript 最佳实践

如何避免 ASP.NET MVC 中的 HttpRequestValidationException 呈现导致异常的相同视图

ASP.NET Core MVC 过滤器介绍

ASP.NET MVC3 如何通过跨 Action 调用共享单个 AsyncManager 实例来避免多线程错误?

[转] ASP.NET MVC 模型绑定的功能和问题

调试 ASP.NET MVC 应用程序时避免部署