13

Add ビューと Edit ビューは非常によく似ているため、2 つのビューを記述することは適切ではありません。アプリが進化するにつれて、両方に同じ変更を加えることになります。

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

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

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

4

4 に答える 4

5

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

新規/編集の2つのアクションは次のとおりです。

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

   ....

}

そして、ここにビューがあります:

<% 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");
}
于 2008-09-03T15:01:12.057 に答える
4

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

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

私はasp.netmvcが大好きですが、それはまだ成熟しており、Webサイトを作成する際の摩擦を取り除くためにさらに砂糖を追加する必要があります。

于 2008-08-20T21:18:52.340 に答える
2

個人的には、ビューのすぐそこにあるif/elseを使用することを好みます。それは私が一度にすべてが見えているのを見るのを助けます。

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

<%= Helper.ProfessionField() %>

string ProfessionField()
{
    if(IsNewItem) { return /* some drop down code */ }
    else { return "<p>" + _profession+ "</p>"; }        
}
于 2008-08-20T22:02:52.873 に答える
1

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


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

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

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

于 2008-11-14T17:46:55.723 に答える