0

私は ASP.NET MVC に非常に慣れていないため、これが知っておくべきことである場合はご容赦ください。私はそれに関する明白な文書を見たことがないので、ここに行きます:

LINQ to Entities データ モデルと MVC プロジェクトがあります。私は多くの javascript/jquery を使用しているため、WebAPI を介して json オブジェクトとしてクライアントからデータにアクセスすることを選択しました。ただし、すべてのエンティティ オブジェクト プロパティをクライアントに渡したくはないので、MVC モデルの検証とビューへのバインドを処理する MVC プロジェクトに別のモデルを追加しました。また、jquery で使用するために、モデルの json バージョンを作成しました。

これはプロジェクトの始まりに過ぎず、間違ったスタートを切りたくありません。ビジネス層のエンティティごとに 3 つのバージョンのモデルを持つことは、悪夢になるでしょう! 私のプロジェクトの全体的な構造は非常に一般的なものだと確信していますが、多くの開発者がそのようなコードの重複に落ち着いているとは思えません。それを実装するためのより良い方法があるはずです。

何かご意見は?ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

1

上記のコメントへの回答として、JavaScript ビューモデルを標準の js オブジェクトとして作成できます。私は Knockout.js を使用する傾向があるため、次のようになります。

jsController.Resource = function (data) {

    self.UserId = ko.observable(data.UserId);
    self.FullName = ko.observable(data.Name);
    self.RoleName = ko.observable(data.RoleName);
    self.RoleId = ko.observable(data.RoleId); 
} 

次に、ajax post メソッドを使用して MVC アクションに投稿します

jsController.addToUndertaking = function (resource, isAsync) {
    mylog.log("UndertakingId at post = " + jsController.undertakingId);

    var action = $.ajax({
        type: "POST",
        url: "/TeamMember/AddUserToUndertaking",
        data: resource,
        cache: false,
        async: isAsync
    });

    action.done(function () {
        resource.AllocatedToUndertaking(true);
    //Do other funky stuff
    });
};  

次のようにフォーム コレクションを受け入れるように、MVC アクションを作成します。

public ActionResult AddUserToUndertaking(FormCollection postedResource)
    {
        if (Request.IsAjaxRequest() == false)
        {
            const string msg = "Non ajax request received";
            Logger.ErrorFormat(msg);
            throw new SecurityException(msg);
        }

        if (postedResource == null)
        {
            Logger.Debug("Null resource posted - terminating.");
            return new HttpStatusCodeResult(500);
        }

        var resource = new AllocatedResourceAjaxViewModel(postedResource);
    //Do something Funky
       return new HttpStatusCodeResult(200);
    }

次に、フォーム コレクションから MVC ビューモデルを作成します (フォーム コレクションをコンストラクター メソッドとしてビューモデルに渡すことでこれを行う傾向があります)。

public class AllocatedResourceAjaxViewModel
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public string RoleName { get; set; }
    public int RoleId { get; set; }


    public AllocatedResourceAjaxViewModel()
    {}

    public AllocatedResourceAjaxViewModel(NameValueCollection formData)
    {
        UserId = JsFormDataConverter.Int(formData["UserId"]);
        Name = Convert.ToString(formData["FullName"]);
        RoleName = Convert.ToString(formData["RoleName"]);
        RoleId = JsFormDataConverter.Int(formData["RoleId"]);

    }

}

JavaScript VM の null int は「未定義」の文字列が渡されるため、非文字列を安全に抽出するためのコンバーター メソッドが必要です。

public static class JsFormDataConverter
{
    public static bool Boolean(string formValue, bool defaultValue = false)
    {
        if (formValue.ToLower() == "true") return true;
        if (formValue.ToLower() == "false") return false;
        return defaultValue;
    }


    public static int Int(string formValue, int defaultValue = 0)
    {
        int result;
        return int.TryParse(formValue, out result) 
            ? result 
            : defaultValue;
    }

}

そして、そこに行きます。上記を改善できると確信していますが、それでうまくいくでしょう。

于 2012-06-25T08:48:08.433 に答える
0

私が常に取り組んできた方法は、すべてのデータを保存し、SQL によってデータベースから直接、または (最近ではより一般的に) NHibernate や Entity などの ORM によってハイドレートされる場所である Order & OrderLines などのモデルを使用することです。フレームワーク。

次に、ViewModels があります。これらは、アプリケーションからビューにデータを転送するために使用されます。直接、つまり OrderViewModel にバインドされた厳密に型指定されたビュー、または JsonResult を返すアクションを介します。

OrderViewModel は、画面に表示する必要があるデータのみを保持するように設計されているため、Order の複製ではありません (異なる方法で Order を表示する多くの異なるビューがある場合、多くの異なる ViewModel を持つことは完全に許容される可能性があります -各ビューに必要なフィールドのみを含むビューごとに 1 つ)。また、ViewModel には、他の ViewModel 以外の複合型を含めることはできません。これにより、ビューから偶発的なデータ アクセスを防ぐことができます (セキュリティとパフォーマンスを考えてください)。

与えられた

public class Order
{
    public int Id { get; set; }
    public DateTime OrderDate { get; set; }
    public User User { get; set; }
    public string  Description { get; set; }
    public List<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    public int Id { get; set; }
    public Order Order { get; set; }
    public String Description { get; set; }
    public int Quantity { get; set; }
    public int Weight { get; set; }
    public int Price { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2 つの ViewModel を持つことができます

public class OrderViewModel
{
    public int ID { get; set; }
    public List<OrderLineViewModel> OrderLines { get; set; }
    public DateTime OrderDate { get; set; }
    public int UserId { get; set; }
    public string Description { get; set; }
}

public class OrderLineViewModel
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public String Description { get; set; }
    public int Quantity { get; set; }
    public int Weight { get; set; }
    public int Price { get; set; }
}

ビュー モデルは、必要に応じて JSON にシリアル化するか、検証属性などでマークアップすることができます。

于 2012-06-24T10:56:07.207 に答える