Мне сложно следовать хорошему объектно-ориентированному проектированию в ASP.NET MVC2, и я думаю, что проблема заключается в плохом понимании того, как ViewModels и Views должны взаимодействовать, когда пользователь будет публиковать информацию.
Я создал форум, который позволяет пользователям создавать ответы в теме, используя действие Ответить. Мой ReplyViewModel содержит int для threadId и строку для содержимого ответа. Действие Reply создает ReplyViewModel с ThreadId, чтобы мы знали, на какой поток отвечает пользователь. Представление «Ответ» строго типизировано в ReplyViewModel и имеет форму, позволяющую пользователю редактировать содержимое модели. Затем пользователь может опубликовать действие «Ответить» с параметром threadId в качестве параметра.
Это работает, но я не думаю, что делаю это правильно. Каждое сообщение включает в себя две ReplyViewModels: одну с идентификатором threadId, но с нулевым содержимым, а другую с контентом, но с нулевым ThreadId. Представление «Ответ» создает новую модель «ReplyViewModel», и я думаю, что это должно быть просто редактирование модели «ReplyViewModel», которая была передана в представление - но я не знаю, как.
Вот урезанная версия представления:
<%@ 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 - это буквально просто строка (content) и int (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 для передачи из контроллера в представление и обратно в контроллер?»