ASP.NET MVC2: представления, модели представления и запросы Post - PullRequest
0 голосов
/ 27 ноября 2010

Мне сложно следовать хорошему объектно-ориентированному проектированию в 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 для передачи из контроллера в представление и обратно в контроллер?»

1 Ответ

1 голос
/ 27 ноября 2010

Я думаю, что вы делаете хорошо.

Вы думаете о проблеме, с которой вам еще не приходилось сталкиваться, которая равна , когда данныеЗаполнение формы сильно отличается от данных, которые будут опубликованы .Здесь модель представления «Get» является подмножеством модели представления «Post», поэтому использование одной модели представления - это хорошо, но если данные для «Get» и данные для «Post» сильно отличаются, вы можете использовать дваразные модели представлений, такие как:

public class GetReplyFromViewModel  //...
public class PostReplyFromViewModel //...

Но я бы сказал против этого, если только обе модели представлений не были очень разными и достаточно сложными, чтобы требовать своих собственных моделей представлений. только потому, что представление строго типизировано для типа «A», не означает, что тип параметра в методе post не может быть типом «B».

  • Тип представления будет просто определять компиляцию / intellisense в представлении вместе с проверкой типа представления при каждом его создании.
  • Тип параметра метода post просто использует привязку модели MVC для преобразования отправленной формы HTTP в указанный вами тип.

Другими словами, тип вашего представления может быть просто

<%@ Page Title="" ... Inherits="System.Web.Mvc.ViewPage<int>" %> 

Где вся переменная Model это просто ThreadId, если хотите, и метод post можетпо-прежнему принимайте тот же параметр, если ваши html-поля были названы правильно.

но опять же, в данном конкретном случае я думаю, что текущая реализация в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...