C# ASP.NET MVC查看键/值对中的模型
如何将键/值对表示为ASP.NET MVC模型?我的表单数据没有强类型模型的支持 我的第一个解决方案是使用Razor设计表单,并使用一些扩展方法来获取FormElement值C# ASP.NET MVC查看键/值对中的模型,c#,asp.net-mvc-4,razor,C#,Asp.net Mvc 4,Razor,如何将键/值对表示为ASP.NET MVC模型?我的表单数据没有强类型模型的支持 我的第一个解决方案是使用Razor设计表单,并使用一些扩展方法来获取FormElement值 @model IEnumerable<FormElementKeyValues> @Html.TextBox(Model.GenerateID("Email"), Model.GetFormElementValue("Email"))<br /> 这将允许我在视图中使用强类型模型以及标准的Raz
@model IEnumerable<FormElementKeyValues>
@Html.TextBox(Model.GenerateID("Email"), Model.GetFormElementValue("Email"))<br />
这将允许我在视图中使用强类型模型以及标准的Razor Html帮助程序
<div class="editor-field">
@(Html.TextBoxFor(model => model.Firstname))
@(Html.ValidationMessageFor(model => model.Firstname))
@(Html.DisplayFor(model => model.Firstname))
</div>
@(Html.TextBoxFor(model=>model.Firstname))
@(Html.ValidationMessageFor(model=>model.Firstname))
@(Html.DisplayFor(model=>model.Firstname))
我想你已经把这项任务复杂化了
模型在那里,您可以从Razor视图中进行渲染和消费
比如说,我有一个卖节日门票的网站,我有一个订单,我想让它在我卖门票的所有不同活动中重复使用,我想用这个表单预先填充活动的名称。。。这就是你要做的
首先你需要一个模型
public class RegistrationViewModel {
[Display(Name = "Event")]
public string EventName { get; set; }
[Required]
[Display(Name = "First name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last name")]
public string LastName { get; set; }
}
接下来,让我们想象一下,我们有一个事件
控制器,其操作名为寄存器
public class Events : Controller
{
public ActionResult Register(int id)
{
Event event = DbSource.FindEventById(id);
RegistrationViewModel model = new RegistrationViewModel
{
EventName = event.Name
}
return this.View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegistrationViewModel model)
{
if( ! ModelState.IsValid )
{
return this.View(model);
}
// ship the tickets, return thank you view, etc...
}
}
最后,我们的观点
@model RegistrationViewModel
@using (Html.BeginForm("Register", "Events")
{
<div>
@(Html.AntiForgeryToken())
@(Html.LabelFor(model => model.EventName))
@(Html.ValueFor(model => model.EventName))
@(Html.LabelFor(model => model.FirstName))
@(Html.TextBoxFor(model => model.FirstName))
@(Html.ValidationMessageFor(model => model.FirstName))
@(Html.LabelFor(model => model.LastName))
@(Html.TextBoxFor(model => model.LastName))
@(Html.ValidationMessageFor(model => model.LastName))
</div>
}
@model RegistrationViewModel
@使用(Html.BeginForm(“注册”、“事件”)
{
@(Html.AntiForgeryToken())
@(Html.LabelFor(model=>model.EventName))
@(Html.ValueFor(model=>model.EventName))
@(Html.LabelFor(model=>model.FirstName))
@(Html.TextBoxFor(model=>model.FirstName))
@(Html.ValidationMessageFor(model=>model.FirstName))
@(Html.LabelFor(model=>model.LastName))
@(Html.TextBoxFor(model=>model.LastName))
@(Html.ValidationMessageFor(model=>model.LastName))
}
我是动态编写的,所以我不知道它是否会按原样编译,但我向您展示的基本上就是它的全部…这当然是理想的解决方案。我假设您的数据库中有一个事件表,EventModel是该表的1:1表示形式。我的表单后面没有数据库模型m、 我有两个表FormElement和FormValue(我知道这是一个糟糕的设计,但它是2007年的遗留系统,每年处理500000个事务,所以我不能像那样改变它:()@flip虽然看起来这样的DB可能并不理想,但听起来您有一个完美的场景,可以将视图模型转换为数据模型。我知道直接从数据模型转换到视图是不错的,但有时您会情不自禁,比如在愚蠢的DB模式中(听起来像是tdwtf提交),或与服务交互。就我个人而言,我更喜欢使用视图模型,因为它将用户界面与数据库设计分离。@CodeMonkey1313事实上,我的第一个解决方案是一个可行的解决方案,直到我可以移动到一个完整的视图/模型体系结构。我上面介绍的不是您数据库的模型,而是一个
事件 表,并且名字和姓氏将是Customers
表的列,上面的RegistrationViewModel
稍后将转换为我们的业务模式…使用POCO生成器创建您的域模型,因为您已经有了数据库
@model RegistrationViewModel
@using (Html.BeginForm("Register", "Events")
{
<div>
@(Html.AntiForgeryToken())
@(Html.LabelFor(model => model.EventName))
@(Html.ValueFor(model => model.EventName))
@(Html.LabelFor(model => model.FirstName))
@(Html.TextBoxFor(model => model.FirstName))
@(Html.ValidationMessageFor(model => model.FirstName))
@(Html.LabelFor(model => model.LastName))
@(Html.TextBoxFor(model => model.LastName))
@(Html.ValidationMessageFor(model => model.LastName))
</div>
}