0

MVC を使用するのはこれが初めてで、Web アプリケーションを作成するのも初めてです。

ここまでで、従業員のリストのビューと、Employee モデルの編集ビューを作成できました。

リストとして表示して編集する必要がある 25 個のモデルがある場合、50 個の異なるビューを作成する必要がありますか?

または、1 つの共通のリスト ビューと 1 つの共通の編集ビューを持つ方法はありますか?

(以下を編集)

リスト ビューの問題を解決しました。長いコードで申し訳ありません。

モデル プロパティを記述するModelPropertyInfoクラスを作成しました。今のところ、Label のみを追加しましたが、"Format"、"InputType" などのプロパティをさらに追加する可能性があります。

// Model field information class. Used by views to display model info properly
public class ModelPropertyInfo
{
    public ModelPropertyInfo() { }

    public string Name { get; set; }
    public string Label { get; set; }

}

次に、リスト ビューに表示するモデル プロパティのみを装飾するShowInListAttribute属性クラス

// Attribute class used to specify Labels for model fields
public class ShowInListAttribute : Attribute
{
    public ShowInListAttribute(string header)
    {
        Header = header;
    }

    public string Header { get; set; }
}

そして、すべてのモデルが継承するModelBaseクラス。このクラスは、その名前を文字列として渡すことにより、クラスからプロパティ値を取得する機能を提供します

// Base class for all models
public class ModelBase
{
    public static List<ModelPropertyInfo> ModelProperties(Type modelType)
    {
        List<ModelPropertyInfo> result = new List<ModelPropertyInfo>();
        foreach (PropertyInfo pi in modelType.GetProperties())
        {
            ShowInListAttribute att = (ShowInListAttribute)pi.GetCustomAttributes(typeof(ShowInListAttribute), true).FirstOrDefault();
            if (att != null)
                result.Add(new ModelPropertyInfo { Label = att.Header, Name = pi.Name });
        }
        return result;
    }

    public object GetPropertyValue(string propName)
    {
        return this.GetType().GetProperty(propName).GetValue(this, null);
    }
}

さて、これが私のEmployeeモデルクラスです

[Table("Employee")]
public class Employee : ModelBase
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public decimal ID { get; set; }

    [ShowInList("First Name")]
    public string FirstName { get; set; }

    [ShowInList("Last Name")]
    public string LastName { get; set; }

    public decimal DepartmentID { get; set; }

    [ShowInList("Department")]
    [DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]
    public string DepartmentName { get; set; }
}

したがって、上記のすべてを使用するために、これが私のEmployeeControllerの Index メソッドです。

public ActionResult Index()
{
    ViewBag.Columns = ModelBase.ModelProperties(typeof(Employee));
    ViewBag.Title = "Employee List";
    return View("ListShared", db.Employees.ToList());
}

最後に、必要なモデルのリストを表示するために使用する SharedListView の結果です。

@using SharedListView.Models 

@model IEnumerable<ModelBase>



<h2>@ViewBag.Title</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        @foreach (ModelPropertyInfo col in ViewBag.Columns)
        {
            <th>
                @col.Label
            </th>
        }
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            @foreach (ModelPropertyInfo col in ViewBag.Columns)
            {
                <td width='100px'>
                    @item.GetPropertyValue(col.Name).ToString()
                </td>
            }
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.GetPropertyValue("ID") }) |
                @Html.ActionLink("Details", "Details", new { id=item.GetPropertyValue("ID") }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.GetPropertyValue("ID") })
            </td>
        </tr>
    }
</table>

まだ一般的な編集ビューにこだわっていますが、助けていただければ幸いです。

繰り返しますが、長い編集で申し訳ありません。

4

5 に答える 5

1

その必要はありません。ASP.NET MVC は、ContentFor メソッドと EditorFor メソッドをサポートしています。したがって、あなたの場合、ビューモデルを設計するだけで済み、その後ビューでそのようなものを使用できます

@Html.ContentFor(Model.Employee) // for display - that mean, it should be read-only
@Html.EditorFor(Model.Employee) // for editing.

ここでそのトピックに関する投稿を見ることができます

于 2013-05-22T02:40:45.567 に答える
0

アプリで必要となるさまざまな種類の「フォーム入力」すべての html を生成する何らかのクラスを作成できます。次に、モデルからデータを受け取る機能をクラスに追加します (つまり、モデルから文字列を取得し、その文字列に設定された値で TEXT 入力を作成します .... または、SELECT ドロップダウンはモデルからすべての OPTION を受け取ることができます。等)。

次に、これらすべてのフォーム入力をモデル内から (クラスを使用して) 生成し、単一のビューに渡される配列に送り込むことができます。ビューには周囲のすべての div とその他の html が含まれますが、ビューのどこかに、配列の内容を出力する小さな「for ループ」を配置します。ビューで単純な for ループのみを使用しているという点で、これは有効な MVC です。また、モデルは、データがフォーマットされている場合にデータベースからどのように出力されるか (この場合はフォーム入力) を決定する際に部分的に責任を負う可能性があります。フォーム入力のスタイルを設定するには、css ファイルまたはビューの上部にスタイルを保持できます。

最終的には、アプリの将来に依存します。これは、アプリとモデルが適切な反復構造に適合する場合のアイデアです。しかし、アプリの一部が進化する可能性があると思われる場合、ビューの外観を大幅に変更する必要がある場合や、生成された「フォーム入力」をビューでどのように配置するかをより詳細に制御したい場合は、おそらく次のようになります。より多くの閲覧数。

于 2013-05-22T02:53:00.667 に答える
0

モデル オブジェクトごとに次の構造を使用することをお勧めします。

  1. ListView: アイテムのリストを表示します。そして、ビュー内の各アイテムのビューモデル クラスを作成します
  2. CreateView: 新しいオブジェクトを作成するときに使用されます。このためのViewModelクラスもあります
  3. EditView: 編集モード用であることを除いて、CreateView と同じです。

この構造により、似たような ViewModel を使用して多くのビューが作成されます。しかし、それらは本質的に異なる目的のために異なるため、そうではありません. 構造は、関心の分離、メンテナンスの助けの点でコードを改善します。扱いやすい。

于 2013-05-22T02:42:49.500 に答える
0

Knockout.jsをチェックアウトします。あなたが話しているようなアプリケーション、データのコレクションのビュー、および個々のレコードを編集するためのビューを作成しました。ノックアウトを使用すると、ビューの編集部分をコレクション ビューに簡単に統合できます。WPF および Silverlight スタイルのデータ バインディングについてある程度理解しておくと役に立ちます。現在、すべてのビューでノックアウトを使用しており、コレクション ビューの編集機能を、エディター領域への可視バインディングを使用して適切なデータ バインディングと統合しています。

于 2013-05-22T02:45:49.823 に答える
0

ビューはモデルを使用してデータを表示または編集します。25 の異なるモデルがある場合、すべてのビューに異なるモデルが必要です。1 つのモデルのみを使用したい場合、主に類似したプロパティを共有しているという理由で、これを行うことはできますが、理想的ではありません。これを行う方法は、すべてのモデルが同様のプロパティを持っている場合、すべてのプロパティを 1 つのモデルに含めることができるということです。その後、他のビューで必要なプロパティを使用できます。これは理想的な方法ではありません。すべてのビューには独自のモデルが必要です。

于 2013-05-22T02:45:54.517 に答える