我对MVC有点新意,也许我只是误解了一些东西,但我无法理解如何以优雅的方式做到以下几点: 我有以下实体,我还没有更新: 型号:
public class Entity
{
[Key]
public int Id { get; set; }
public DateTime Created { get; set; }
public int FieldInt { get; set; }
public DateTime FieldDate { get; set; }
public int FieldOther {get; set; }
}
}
查看: 我的视图显示了一串带有复选框的文本行。复选框由两个数据属性标识:data-field-int和data-field-date,这是以下内容。
@html.BeginForm("Confirm", "Home", FormMethod.Post) {
...
<input type='checkbox' data-field-int="1" data-field-date="2014/01/01" />
<input type='checkbox' data-field-int="1" data-field-date="2014/02/02" />
<input type='checkbox' data-field-int="1" data-field-date="2014/03/03" />
...
<button id="ConfirmButton" type="submit" class="btn btn-primary">Confirm</button>
}
控制器中我想要的是当按下ConfirmButton时,为每个复选框创建一个Entity对象,该复选框使用fieldInt和fieldDate的值分别用data-field-int和data-field-date属性填充。< / p>
我可以通过使控制器操作将FormCollection作为输入并通过在fieldInt和fieldDate的串联的复选框上放置name属性,然后在控制器中分离它们并更新db来实现。但似乎会有更好的方法,因为MVC在Entity Framework中非常聪明。
我希望你们能帮助我理解
谢谢你, 彼得
答案 0 :(得分:1)
这个问题由两部分组成:
1。 最好在razor视图中指定 @model ,并使用将模型作为参数的lambda表达式的辅助方法。
@model MyType
html.Textbox(model => model.FieldOther,...)
然后您创建采用模型的操作
[HttpPost]
ActionResult MyAction(MyModel model) {
....
}
Mvc将尝试创建模型的实例并将表单字段映射到模型属性。
2
您可以将实体用作模型,但相信我,所谓的数据传输对象和/或视图模型是出于某种原因而创建的,随着应用程序的发展,单个视图也会进化,以便操纵来自许多相关数据库实体的数据。
答案 1 :(得分:1)
欢迎来到MVC。
- 使用具有模型实体的剃刀引擎是最佳实践。
- 在上面提到的代码中,您需要设置类似这样的内容
@using ( Html.BeginForm("Confirm", "Home", FormMethod.Post))
- 你是新尝试使用带有选定模板的强类型视图,为你生成剃刀代码,即你可以深入分析
- 最后只使用model x
作为[HttpPost]
操作方法的参数,并将这些实体转换为实体框架实体并保存在DB中
另外: 数据属性不包含在随表单发布的数据中,因此无法在控制器操作中读取它们。请尝试使用隐藏字段
像
@Html.HiddenFor(m => m.FieldInt)
或
<input type="hidden" name="FieldInt" value="1234" />
//做同样的休息
传递静态然后@{Model.phoneno = "1234"}