【发布时间】:2013-01-28 08:02:13
【问题描述】:
我首先使用 MVC 4、EF 5 代码,我的服务层仅与域类 (POCO) 交互,而我的 UI 层与 ViewModel 类 (POCO) 交互。
我的问题:
如何从 UI 中指定必填字段并仅从服务层的数据库中获取这些字段?
【问题讨论】:
标签: asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first
我首先使用 MVC 4、EF 5 代码,我的服务层仅与域类 (POCO) 交互,而我的 UI 层与 ViewModel 类 (POCO) 交互。
我的问题:
如何从 UI 中指定必填字段并仅从服务层的数据库中获取这些字段?
【问题讨论】:
标签: asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first
动态构建Select 表达式并不容易,因为在编译时不知道捕获结果的类型(命名或匿名)。我在 StackOverflow 上看到了一些努力,但如果我没记错的话,它们是徒劳的(我现在找不到它们)。
您可以使用Entity Sql 构建查询字符串。
var queryString = string.Format("SELECT {0} FROM MyTable"
, string.Join(",",fieldsFromUi); // WHERE...?
var q = new ObjectQuery<DbDataRecord>(queryString , context);
其中context 是ObjectContext 实例。 DbDataRecord 是一个类似字典的结构,您可以从中选择要显示的值。
【讨论】:
This 是 MVC 的最佳实践。 更好的是使用视图模型 您可以使用视图模型并要求列表。例如,这是视图模型,您应该将此模型传递给视图
public class LoginPageVM
{
[Required(ErrorMessage = "Are you really trying to login without entering username?")]
[DisplayName("Username/e-mail")]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter password:)")]
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Stay logged in when browser is closed")]
public bool RememberMe { get; set; }
}
在视图中
@model CamelTrap.Models.ViewModels.LoginPageVM
@using (Html.BeginForm()) {
@Html.EditorFor(m => m);
<input type="submit" value="Save" class="submit" />
}
在控制器中
[HttpGet]
public ActionResult LoginPage()
{
return View();
}
[HttpPost]
public ActionResult LoginPage(LoginPageVM model)
{
...code to login user to application...
return View(model);
}
【讨论】: