【发布时间】:2010-11-27 03:36:51
【问题描述】:
我在 ASP.NET MVC2 中遵循良好的面向对象设计时遇到了麻烦,我认为问题在于对用户发布信息时 ViewModel 和 View 应该如何交互的理解不足。
我实现了一个论坛,允许用户使用回复操作创建对主题的回复。我的 ReplyViewModel 包含一个用于 threadId 的 int 和一个用于回复内容的字符串。回复操作使用 ThreadId 创建一个回复视图模型,因此我们将知道用户正在回复哪个线程。回复视图是回复视图模型的强类型,并具有允许用户编辑模型内容的表单。然后,用户可以将 threadId 作为参数发布到回复操作。
它有效,但我认为我这样做的方式不正确。每个帖子都涉及两个ReplyViewModel:一个具有threadId 但内容为空,另一个具有内容但ThreadId 为空。回复视图正在创建一个新的回复视图模型,我认为它应该只是编辑传递给视图的回复视图模型——但我不知道如何。
这是视图的精简版:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<mvcForum.ViewModels.ReplyViewModel>" %>
<%: Html.TextAreaFor(model=> model.content, new{TextMode="multiline", id="postbox"})%>
<input type="submit" value="Reply" />
如果这还不足以回答我的问题,这里是整个视图:http://pastebin.com/BFGL4p67
ViewModel 实际上只是一个字符串(内容)和一个整数(threadId)。
控制器:
[Authorize]
public ActionResult Reply(int id)
{
ReplyViewModel reply = new ReplyViewModel
{
ThreadId = id
};
return View(reply);
}
[HttpPost]
public ActionResult Reply(int id, ReplyViewModel model)
{
/**TODO: Catch when no user*/
var newPost = new ForumPost
{
UserId = (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey,
ThreadId = id,
postContent = model.content
};
db.AddToForumPosts(newPost);
db.SaveChanges();
return RedirectToAction("Index");
}
所以我的问题是“做我想做的事情的最佳方法是什么?我可以使用 ReplyViewModel 的单个实例从控制器传递到视图,然后再返回到控制器吗?”
【问题讨论】:
-
我认为您在这里做得很好...不确定您要解决的确切问题是什么?
-
使用一个类的两个实例来做两件完全独立的事情似乎是错误的,每个实例中只使用一个字段。如果我可以使用相同的实例会更有意义。