0

我对 ASP.NET MVC 很陌生,所以如果这是我应该知道的,请原谅我。我还没有看到任何明显的文档,所以这里是:

我有一个 LINQ to Entities 数据模型和一个 MVC 项目。我使用了很多 javascript/jquery,因此选择通过 WebAPI 作为 json 对象从客户端访问我的数据。但是,我不想将所有实体对象属性都传递给客户端,因此我在我的 MVC 项目中添加了单独的模型,我在其中处理 MVC 模型验证和绑定到我的视图。此外,为了在我的 jquery 中使用它,我创建了模型的 json 版本。

这只是项目的开始,我不想从错误的角度开始。为我的业务层中的每个实体拥有三个版本的模型将是一场噩梦!我确信我的项目的整体结构是一个非常普通的结构,但看不到很多开发人员满足于这样的代码重复。必须有更好的方法来实现它。

有什么想法吗?非常感谢任何输入。

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 或实体等 ORM 直接从数据库中获取水分。框架。

然后你有 ViewModels——它们用于将数据从你的应用程序传输到视图——或者直接,即绑定到 OrderViewModel 的强类型视图,或者通过返回 JsonResult 的操作。

OrderViewModel 不是 Order 的重复,因为它旨在仅保存需要在屏幕上显示的数据(如果您有许多不同的视图以不同的方式显示 Order,那么拥有许多不同的 ViewModel 是完全可以接受的 -每个视图一个,只包含每个视图所需的字段)。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; }
}

你可以有两个 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 回答