2008-08-20 1 views
13

[追加]ビューと[編集]ビューは、2つのビューを作成することが妥当ではないという点で非常によく似ています。アプリケーションが進化するにつれ、あなたは両方に同じ変更を加えるでしょう。ASP.NET MVCを使用すると、[ビューの追加]と[ビューの編集]の両方を書くのを避けるにはどうすればよいですか?

しかし、通常は微妙な違いがあります。たとえば、フィールドが追加されると読み取り専用になり、そのフィールドがDropDownListの場合は、ViewDataでそのListは必要なくなります。

したがって、両方のビューのすべての情報を含むビューデータクラスを作成する必要があります。実行する操作によっては、特定のプロパティはnullになりますか?
操作をビューデータにenumとして含めるべきですか?
<%の微妙な違いをすべて囲む必要がありますか(ViewData.Model.Op == Ops.Editing){%>

もっと良い方法がありますか?

+0

うん!それは、同じビューを使用することができればいいです:追加、編集、表示... –

答えて

4

私はビューが複雑すぎるようには好きではありません。これまでは、編集と追加のビューを別々にする傾向がありました。私は繰り返しを避けるために共通の要素を格納するためにユーザーコントロールを使用します。どちらのビューも同じViewDataを中心に配置され、データが新しいオブジェクトか既存のオブジェクトかを示すマーカーがあります。

これはあなたが規定したものよりもエレガントではないので、DjangoまたはRailsの人が入力を提供できるかどうか疑問に思います。

私はasp.net mvcが大好きですが、それはまだ成熟しており、ウェブサイトを作成することの摩擦を取り除くためにはまだ砂糖を追加する必要があります。

2

私は個人的には、ビュー内のif/elseを好むだけです。私はすべてのことを一度に見ることができます。

タグスープを避けたい場合は、ヘルパーメソッドを作成することをおすすめします。

<%= Helper.ProfessionField() %> 

string ProfessionField() 
{ 
    if(IsNewItem) { return /* some drop down code */ } 
    else { return "<p>" + _profession+ "</p>"; }   
} 
5

本当に簡単です。ブログ記事を編集しているとしましょう。

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); 
    } 

    .... 

} 

そして、ここでビューの:

は、ここで新しい/編集のためのあなたの2つのアクションだ

<% 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"); 
} 
+0

あなたの行ったことを正確に再投稿するのではなく、元の質問で尋ねられたように、編集画面で読み取り専用にフィールドを切り替える例を含むように回答を編集することをお勧めします。 – Chris

1

CustomViewDataクラスを指定して、ここでパラメータを渡すことができます。


public class MyViewData { 
    public bool IsReadOnly { get; set; } 
    public ModelObject MyObject { get; set; } 
} 

両方のビューでこのViewDataを実装する必要があります。 結果として、提供されたIsReadOnlyプロパティを使用してUserControl結果を管理できます。

コントローラがこれを使用するので、ユニットテストが可能で、ビューには実装がないため、MVCの原則を尊重することができます。

関連する問題