5

ASP.NET MVC 3(Razor)アプリケーションでの作業。これは、主にUGC(ユーザー生成コンテンツ)に関係しています。

私は「Q&A」エリアに取り組んでいます-ユーザーが質問したり、他の人が答えたり、投票したりできる場所です。

そのため、私は、ユーザーの役割やその他の要因に基づいて、ユーザーが任意のページで実行できる操作を処理するためのクリーンな方法を見つけようとしています。

「質問の詳細ページ」(Stack Overflowのこのページのような)のシナリオを考えてみましょう。

すべての(認証された)ユーザーは次のことができます。

  • 質問/回答に投票する
  • 答え

質問の所有者は次のことができます。

  • 編集
  • 消去
  • 答えをマークする

などなど。

これで、QuestionViewModelこの特定のビューの質問と関連する回答を表示するために使用されるがあります。

AutoMapperを使用して作成します。

利用可能な操作に基づいて、ページに「スティッキー」(ハイパーリンクなど)を表示するにはどうすればよいですか?

私の現在の考え方は次のとおりです。

  • 列挙型を作成します:(QuestionOperation回答、編集、無効化、投票、回答など)
  • IEnumerable<QuestionOperation>タイプのプロパティをViewModelに追加します
  • このプロパティをアクションメソッド(HTTP GET)で設定し、ユーザーが認証されているかどうか、およびユーザーが含まれているロールを確認します。
  • 次に、エディターテンプレートを使用して、各操作をハイパーリンクとしてレンダリングします。Html.ActionLink

それはクリーンなアプローチと見なされますか?それとも誰かがより良いアプローチを提案できますか?

私はこれQuestionViewModelを3ページで再利用していることを覚えておいてください:

  1. 質問詳細ページ
  2. 「質問する」ページ
  3. 「質問の編集」ページ

したがって、これらの操作はページ/ユーザーに依存するため、AutoMapperでは実際には実行できません。

4

1 に答える 1

1

必要なリンクを含む部分ビューを返す別のコントローラーとアクションをセットアップします。次に、Html.Actionヘルパーを使用して、メイン ビューからそれを含めます。

行の中の何か:

public class UserLinksController: Controller
{
    // TODO: ctor DI of a repository, etc...

    public ActionResult Index(string questionId)
    {
        string username = User.Identity.IsAuthenticated 
            ? User.Identity.Name : string.Empty;
        var roles = _repository.GetRolesForQuestion(username, questionId);
        var model = Mapper.Map<UserRoles, RolesViewModel>(roles);
        return PartialView(model);
    }
}

対応するパーシャルで、ビュー モデルをチェックし、必要なリンクをレンダリングします。

@model RolesViewModel
@if(Model.CanEdit)
{
    @Html.ActionLink("Edit", "Edit", "Questions")    
}
@if(Model.CanDelete)
{
    @Html.ActionLink("Delete", "Delete", "Questions")    
}
...

メインビューのどこかに、Html.Actionメソッドを使用してこのアクションを含めるだけです。

@Html.Action("Index", "UserLinks", new { questionId = Model.QuestionId })
于 2011-06-06T06:34:12.797 に答える