- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我一直在编写教程并尝试学习有关 MVC 开发的最佳实践。我在下面使用的设计来自 Apress/Adam Freeman 的 Pro ASP.Net MVC5。到目前为止,一切进展顺利……但我仍然没有完全掌握如何使用 Controllers。是的,我了解 Controller 的概念,但在发布和获取方法时仍然很挣扎。这是我的示例 MVC 应用程序的流程:
我的 app.Domain 项目
我在数据库中有一个用户表并用 Entities/Users.cs 引用它
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace app.Domain.Entities
{
public class Users
{
[Key]
public int UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string City { get; set; }
public string State { get; set; }
public DateTime CreateDate { get; set; }
public DateTime LastLogin { get; set; }
}
}
接下来,我有一个接口(interface),它位于 Abstract/IUsersRepository.cs
using System;
using System.Collections.Generic;
using app.Domain.Entities;
namespace app.Domain.Abstract
{
public interface IUsersRepository
{
IEnumerable<Users> Users { get; }
}
}
继续前进,现在我填充我的实体 Concrete/EFUsersRepository.cs
using System;
using System.Collections.Generic;
using app.Domain.Entities;
using app.Domain.Abstract;
namespace app.Domain.Concrete
{
public class EFUsersRepository : IUsersRepository
{
private EFDbContext context = new EFDbContext();
public IEnumerable<Users> Users
{
get { return context.Users; }
}
}
}
此外,教科书使用的是我理解的 Ninject,并且所有内容都已正确绑定(bind)。除非有人要求我,否则我不会发布该代码。
这是我的 app.WebUI 解决方案:
教科书引导我创建一个 ViewModel。这对我来说有点模糊。 ViewModel 是获取实体的额外 channel 吗?我是否应该始终创建 ViewModel 来选择、更新、插入、删除数据 (Models/UsersViewModel.cs),而不是引用模型本身?
using System;
using System.Collections.Generic;
using app.Domain.Entities;
namespace app.WebUI.Models
{
public class UsersViewModel
{
//public string FirstName { get; set; }
//public string LastName { get; set; }
//public string Email { get; set; }
//public string City { get; set; }
//public string State { get; set; }
public IEnumerable<Users> Users { get; set; }
}
}
该场景是用户输入电子邮件,然后 Controller 检查数据库中的电子邮件。如果存在,则重定向到关于 View (Controllers/HomeController.cs)。
using System.Linq;
using System.Web.Mvc;
using app.Domain.Abstract;
using app.WebUI.Models;
namespace app.Controllers
{
public class HomeController : Controller
{
private IUsersRepository repository;
public HomeController(IUsersRepository usersRepository)
{
this.repository = usersRepository;
}
[HttpGet]
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index()
{
UsersViewModel userViewModel = new UsersViewModel()
{
Users = repository.Users
.Where(p => p.Email == "LearningMVC5@gmail.com")
};
return View("About", userViewModel);
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
}
这是我的 View (Home/Index.cshtml):
@model app.WebUI.Models.UsersViewModel
@{
ViewBag.Title = "Home Page";
Layout = "~/Views/Shared/_LayoutNoMenu.cshtml";
}
@foreach (var p in Model.Users)
{
<div class="container">
@using (Html.BeginForm("About", "Home", FormMethod.Get, new { @class = "begin-form" }))
{
<h1>Welcome</h1>
<div class="required-field-block">
<textarea rows="1" class="form-control" placeholder="Email" id="filter"></textarea>
</div>
<button class="btn btn-primary" type="submit">Login</button>
}
</div>
}
关于如何正确使用 ViewModel 有什么建议吗?
最佳答案
2014年6月,学习MVC的时候问了这个问题。到今天为止,我理解了 View 模型的概念。希望这会帮助另一个 MVC 初学者:
代表数据库表的模型:
public partial class County : Entity
{
public int CountyID { get; set; }
public string CountyName { get; set; }
public string UserID { get; set; }
public DateTime? CreatedDate { get; set; }
public string ModifiedUserID { get; set; }
public DateTime? ModifiedDate { get; set; }
public virtual IList<Property> Properties { get; set; }
public virtual DistrictOffice DistrictOffice { get; set; }
public virtual IList<Recipient> Recipients { get; set; }
}
有两种一对多关系和一种一对一关系。 Entity Framework 和依赖注入(inject)。 (这不是 View 模型解释所必需的。)
首先,我创建了一个用于临时存储的 View 模型,以便从 Controller 传递到 View 。 CountyViewModel.cs
public class CountyViewModel
{
[HiddenInput]
public int? CountyId { get; set; }
[DisplayName("County Name")]
[StringLength(25)]
public string CountyName { get; set; }
[DisplayName("Username")]
[StringLength(255)]
public string Username{ get; set; }
}
您可以灵活地使用与您的模型不同的名称和数据类型。例如,我的数据库列是 UserID,我的模型是 UserID,但我的 View 模型是 UserName。您不需要将数据传递给不会被使用的 View (例如,整个模型)。这个例子只需要 County 模型的三个部分。
在我的 Controller 中,我声明了我的 View 模型:
我需要数据:
var county = _countyService.Get(countyId);
接下来,
CountyViewModel countyViewModel = new CountyViewModel();
countyViewModel.CountyId = county.CountyID;
countyViewModel.CountyName = county.CountyName;
countyViewModel.UserName = county.UserID;
也可以这样声明:
CountyViewModel countyViewModel = new CountyViewModel
{
CountyId = county.CountyID,
CountyName = county.CountyName,
UserName = county.UserID
};
现在是传递 View 的时候了:
return View(countyViewModel);
在 View 中:
@model Project.Web.ViewModels.CountyViewModel
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>@Model.CountyName</div>
@Html.HiddenFor(model => model.CountyId)
<div>
@Html.TextBoxFor(model => model.CountyName, new { @class = "form-control" })
这是一个使用 View 模型传递数据并使用 Entity Framework 对数据库进行服务调用的简单示例:
示例 Controller
public class PropertyController : Controller
{
private readonly ICountyService _countyService;
public PropertyController(ICountyService countyService)
: base()
{
_countyService = countyService;
}
[HttpGet]
public ActionResult NewProperty()
{
using (UnitOfWorkManager.NewUnitOfWork())
{
ListAllCountiesViewModel listAllCountyViewModel = new ListAllCountiesViewModel()
{
ListAllCounty = _countyService.ListOfCounties().ToList()
};
PropertyViewModel viewModel = new PropertyViewModel()
{
_listAllCountyViewModel = listAllCountyViewModel,
_countyViewModel = new CountyViewModel(),
};
return View(viewModel);
}
}
}
示例 View 模型
public class CountyViewModel
{
[HiddenInput]
public int? CountyId { get; set; }
[DisplayName("County Name")]
[StringLength(25)]
public string CountyName { get; set; }
[DisplayName("County URL")]
[StringLength(255)]
public string URL { get; set; }
}
public class ListAllCountiesViewModel
{
public string CountyName { get; set; }
public IEnumerable<County> ListAllCounty { get; set; }
}
public class PropertyViewModel
{
public ListAllCountiesViewModel _listAllCountyViewModel { get; set; }
public CountyViewModel _countyViewModel { get; set; }
}
示例服务层
public partial interface ICountyService
{
County Get(int id);
County GetByCompanyCountyID(int id);
IEnumerable<County> ListOfCounties();
void Delete(County county);
IEnumerable<State> ListOfStates();
void Add(County county);
County SearchByName(string county);
}
public partial class CountyService : ICountyService
{
private readonly ICountyRepository _countyRepository;
public CountyService(ICountyRepository countryRepository)
{
_countyRepository = countryRepository;
}
/// <summary>
/// Returns a county
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public County Get(int id)
{
return _countyRepository.Get(id);
}
/// <summary>
/// Returns a county by County Id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public County GetByCountyID(int id)
{
return _countyRepository.GetByMedicaidCountyID(id);
}
/// <summary>
/// Returns all counties
/// </summary>
/// <returns></returns>
public IEnumerable<County> ListOfCounties()
{
return _countyRepository.ListOfCounties();
}
/// <summary>
/// Deletes a county
/// </summary>
/// <param name="county"></param>
public void Delete(County county)
{
_countyRepository.Delete(county);
}
/// <summary>
/// Return a static list of all U.S. states
/// </summary>
/// <returns></returns>
public IEnumerable<State> ListOfStates()
{
var states = ServiceHelpers.CreateStateList();
return states.ToList();
}
/// <summary>
/// Add a county
/// </summary>
/// <param name="county"></param>
public void Add(County county)
{
county.CreatedUserID = System.Web.HttpContext.Current.User.Identity.Name;
county.CreatedDate = DateTime.Now;
_countyRepository.Add(county);
}
/// <summary>
/// Return a county by searching it's name
/// </summary>
/// <param name="county"></param>
/// <returns></returns>
public County SearchByName(string county)
{
return _countyRepository.SearchByName(county);
}
}
示例 存储层
public partial class CountyRepository : ICountyRepository
{
private readonly Context _context;
public CountyRepository(IContext context)
{
_context = context as Context;
}
public County Get(int id)
{
return _context.County.FirstOrDefault(x => x.CountyID == id);
}
public County GetByCompanyCountyID(int id)
{
return _context.County.FirstOrDefault(x => x.CountyID == id);
}
public IList<County> ListOfCounties()
{
return _context.County.ToList()
.OrderBy(x => x.CountyName)
.ToList();
}
public void Delete(County county)
{
_context.County.Remove(county);
}
public County Add(County county)
{
_context.County.Add(county);
return county;
}
public County SearchByName(string county)
{
return _context.County.FirstOrDefault(x => x.CountyName == county);
}
}
关于c# - MVC View 模型示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24469192/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Sample data for IPv6? 除了 wireshark 在其网站上提供的内容之外,是否有可以下
我正在寻找可以集成到现有应用程序中并使用多拖放功能的示例或任何现成的解决方案。我在互联网上找到的大多数解决方案在将多个项目从 ListBox 等控件拖放到另一个 ListBox 时效果不佳。谁能指出我
我是 GATE Embedded 的新手,我尝试了简单的示例并得到了 NoClassDefFoundError。首先我会解释我尝试了什么 在 D:\project\gate-7.0 中下载并提取 Ga
是否有像 Eclipse 中的 SWT 示例那样的多合一 JFace 控件示例?搜索(在 stackoverflow.com 上使用谷歌搜索和搜索)对我没有帮助。 如果它是一个独立的应用程序或 ecl
我找不到任何可以清楚地解释如何通过 .net API(特别是 c#)使用谷歌计算引擎的内容。有没有人可以指点我什么? 附言我知道 API 引用 ( https://developers.google.
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
我正在尝试为我的应用程序设计配置文件格式并选择了 YAML。但是,这(显然)意味着我需要能够定义、解析和验证正确的 YAML 语法! 在配置文件中,必须有一个名为 widgets 的集合/序列。 .这
你能给我一个使用 pysmb 库连接到一些 samba 服务器的例子吗?我读过有类 smb.SMBConnection.SMBConnection(用户名、密码、my_name、remote_name
linux服务器默认通过22端口用ssh协议登录,这种不安全。今天想做限制,即允许部分来源ip连接服务器。 案例目标:通过iptables规则限制对linux服务器的登录。 处理方法:编
我一直在寻找任何 PostProjectAnalysisTask 工作代码示例,但没有看。 This页面指出 HipChat plugin使用这个钩子(Hook),但在我看来它仍然使用遗留的 Po
我发现了 GWT 的 CustomScrollPanel 以及如何自定义滚动条,但我找不到任何示例或如何设置它。是否有任何示例显示正在使用的自定义滚动条? 最佳答案 这是自定义 native 滚动条的
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
我需要一个提交多个单独请求的 django 表单,如果没有大量定制,我找不到如何做到这一点的示例。即,假设有一个汽车维修店使用的表格。该表格将列出商店能够进行的所有可能的维修,并且用户将选择他们想要进
我有一个 Multi-Tenancy 应用程序。然而,这个相同的应用程序有 liquibase。我需要在我的所有数据源中运行 liquibase,但是我不能使用这个 Bean。 我的应用程序.yml
我了解有关单元测试的一般思想,并已在系统中发生复杂交互的场景中使用它,但我仍然对所有这些原则结合在一起有疑问。 我们被警告不要测试框架或数据库。好的 UI 设计不适合非人工测试。 MVC 框架不包括一
我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。 如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :A
$condition使用说明和 $param在 findByAttributes在 Yii 在大多数情况下,这就是我使用 findByAttributes 的方式 Person::model()->f
我在 Ubuntu 11.10 上安装了 qtcreator sudo apt-get install qtcreator 安装的版本有:QT Creator 2.2.1、QT 4.7.3 当我启动
我是一名优秀的程序员,十分优秀!