使用 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 呈现导致异常的相同视图